KeyValuePair
implementiert nicht INotifyPropertyChanged
, so habe ich meinen eigenen Pair
Typ implementiert, aber ich möchte es in einem Wörterbuch verwenden.Benötigen Sie ein Diktat mit meinem eigenen benutzerdefinierten Paartyp?
Was ist der einfachste Weg, das zu tun?
Also hier ist der Deal. In meinem Code brauche ich ein Wörterbuch mit Schlüssel/Wert-Paaren. Dies muss nicht wirklich beobachtbar sein.
Ich habe jedoch ein Bearbeitungsfenster, das dieses Diktat in einem Datagrid anzeigt. Das muss beobachtbar sein, damit das Datagrid seine Wirkung entfalten kann.
Also, was ich habe, ist, getan machen machen das Fenster zur Bearbeitung jedes zählbare von Paaren akzeptieren:
public ObservableCollection<Pair<string,object>> Variables { get; private set; }
public VariablesWindow(IEnumerable<Pair<string, object>> vars)
{
Variables = new ObservableCollection<Pair<string, object>>(vars.DeepCopy());
so dass es seine Sache zu tun. Und dann im Haupt Code, den ich ein dict wie normale verwenden, aber wenn ich das Bearbeitungsfenster öffnen muss ich das Bearbeitungsfenster können die dict in etwas umwandeln verwenden:
var window = new VariablesWindow(Dict2Enum(_dict));
Also habe ich diese 2 Helfermethoden hinzugefügt :
private static IEnumerable<Pair<TKey, TValue>> Dict2Enum<TKey, TValue>(Dictionary<TKey, TValue> dict)
{
return dict.Select(i => new Pair<TKey, TValue>(i.Key, i.Value));
}
private static Dictionary<TKey, TValue> Enum2Dict<TKey, TValue>(IEnumerable<Pair<TKey, TValue>> collection)
{
return collection.ToDictionary(p => p.Key, p => p.Value);
}
Scheint ein bisschen teuer, obwohl. Ich wiederhole die Sammlung jetzt zweimal. Einmal, um das Dictionary in ein Enumerable zu konvertieren, dann erneut, um es tief zu kopieren, so dass die Variablen nicht geändert werden, bis der Benutzer save trifft, und dann wandle ich dieses Enumerable in eine beobachtbare Sammlung um.
Warum müssen Sie 'INotifyPropertyChanged' für' KeyValuePair' implementieren? Warum implementieren Sie es nicht für TKey oder TValue in 'KeyValuePair'? –
Wann würden Sie das brauchen? KeyValuePair hat nur 2 Eigenschaften und beide sind schreibgeschützt. – Ken
@The Smartest: TKey ist eine Zeichenfolge, TValue ist ein Objekt. Ich glaube nicht, dass ich es für native Typen wie diese implementieren kann, es sei denn, ich wickle es so ein, wie Jon es vorschlägt. @Ken: Nun, ich denke, ich möchte auch nicht, dass sie schreibgeschützt sind. – mpen