Ursache xamDataGrid repaint

Ich brauche einen Weg, für viewmodel zu beauftragen XamDataGrid auf die Ansicht, um nur gelesen und repaint seine Zellen mit minimalem Aufwand. Ich möchte nicht zu Durcheinander mit der Quelle und einige unhaltbare workaround mit der Steigerung Ihres events (die Quelle ändern könnte).

Verständlicher zu gestalten, habe ich eine Globale statische Klasse, die hält einige visuelle Hinweise-Konfiguration, die sich nicht auf Daten, sondern nur die Art, wie Ihr dargestellt, in das Netz (Skalierung, Formatierung, etc). Die visuelle Aktion in der IValueConverter Umsetzung befestigt, um das Feld aus, das funktioniert Prima. Es ist ein statisches Ereignis, das feuert, wenn cues ändern und viewmodels zu abonnieren und Ereignisse richtig zu feuern. Jetzt brauche ich nur um die event-handler die Ursache der raster neu zu streichen.

Irgendwelche Vorschläge?

EDIT: code, falls es hilft:

Konverter:

public class ScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType == typeof(double) || targetType == typeof(double?))
        {
            if (value == null && targetType == typeof(double?)) return null;  //short circuit for null->null, nothing to scale
            if (value is double) return (double)value / DisplayScale.Scale; //shortcut for direct scaling, no need to waste time on conversion
            try
            {
                return System.Convert.ToDouble(value) / DisplayScale.Scale; //for convertible values, eat conversion exception
            }
            catch (Exception) {};
            //if all esle fails return NaN
            return double.NaN; 
        }
        //fallthrough, return null, this should not happen, if it does it means converter is incomplete
        return null;
    }
 ...
}

Darstellungsmaßstab globalen

public class DisplayScale: NotificationObject
{
    private static KeyValuePair<string, double> _ActiveScaling;
    private static readonly object _lockHandle = new object(); //note: should not contest, but just to be on the safe side
    public static event Action ScalingChanged;

    public static List<KeyValuePair<string, double>> ScaleList { get; private set; }

    static DisplayScale()
    {
        ScaleList = new List<KeyValuePair<string, double>>() 
        { 
            new KeyValuePair<string, double>("No scaling (1's)", 1d),
            new KeyValuePair<string, double>("Thousands (1,000's)", 1000d),
            new KeyValuePair<string, double>("Millions (1,000,000's)", 1000000d),
            new KeyValuePair<string, double>("Billions (1,000,000,000's)", 1000000000d)
         };
        ActiveScaling = ScaleList.First();  //OPTION: could be in per-user config
    }

    public static double Scale { get { return ActiveScaling.Value; } }
    public static KeyValuePair<string, double> ActiveScaling
    {
        get
        {
            lock (_lockHandle) return _ActiveScaling;
        }
        set
        {
            lock (_lockHandle)
            {
                _ActiveScaling = value;
                var eventCall = ScalingChanged;
                if (eventCall != null) eventCall();
            }
        }
    }
}

Felder sind definiert als

//resource
<inf:ScaleConverter x:Key="ScaleConverter" />
//field
<igDP:Field Name="Deposit" Converter="{StaticResource ScaleConverter}">
  • kannst du etwas code? Sie haben cellvaluepresenter style(s)?
  • Ich kann nach den code, aber es ist irrelevant, ich will nur das grid zu tun, was es tut, wenn sich die Quelle wirft ListChanged-Ereignis, ohne tatsächlich zu greifen, zu heben ListChanged (denn in Wirklichkeit hat sich nicht geändert, was sich geändert hat sind die Anweisungen für die Wert-Wandler).
  • Haben Sie implementiert die INotifyPropertyChanged-Schnittstelle für Ihre dataclass? Die "Einzahlung" - Eigenschaft muss Feuer, das PropertyChanged-Ereignis auslösen ValueConverter. wenn Sie eine CollectionView als rufen Sie einfach Aktualisieren (), um es.
  • Datenquelle implementiert INotifyPropertyChange und wenn sich die DATEN ändern, das erfrischt, wie es sollte. Das problem ist ich brauche, es zu tun, auch wenn sich die PRÄSENTATION ändert sich die EINSTELLUNG (Darstellungsmaßstab.Skala). Ich kann nicht einen Weg finden, das zu tun. Die ScalingChanged event feuert richtig und wenn ich Band viewmodel es empfängt die Benachrichtigung, aber ich kann nicht einen Weg finden, um die Ursache grid zu aktualisieren, wenn die Daten nicht geändert hat.
InformationsquelleAutor mmix | 2011-12-04
Schreibe einen Kommentar