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. DieScalingChanged
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn Sie eine collectionview als rufen Sie einfach Aktualisieren (), um es.
Ich hatte das gleiche Problem, und es stellt sich heraus, obwohl, ich hatte mein ViewModel die INotifyPropertyChanged implementieren, ich war nicht die Implementierung von INotifyPropertyChanged, in der Klasse, die grid-Zeilen wurden verbindlich in meiner ObservableCollection (d.h. die YourDataClass in punker76 Antwort). Sobald ich es umgesetzt, die für diese Klasse als gut begonnen hatte alles aktualisieren, wie erwartet.
Ich weiß, dass Sie erwähnt "ich will nicht Durcheinander mit der Quelle", also bin ich nicht sicher, ob diese Lösung akzeptabel ist für Sie, aber ich dachte, ich würde teilen, für andere, die diesen Beitrag als gut.