2017-04-26 1 views
1

Ich habe ein Wörterbuch, in dem die Schlüssel Zeichenfolgen sind, und die Werte Eigenschaften in der gleichen Klasse. Wie aktualisiere ich die Werte automatisch, wenn ich die Eigenschaften aktualisiere?Aktualisierung von Wörterbuchwerten automatisch auf Eigenschaften gesetzt

Hier relevanter Abschnitt der Modellklasse:

private Dictionary<string, string> _fields = new Dictionary<string, string>(); 
public Dictionary<string, string> Fields 
{ 
    get 
    { 
     return _fields; 
    } 
} 

public GPHDTModel() 
{ 
    _fields.Add("MessageID", MessageID); 
} 

private string _messageID; 
public string MessageID 
{ 
    get { return _messageID; } 
    set { _messageID = value; OnPropertyChanged("MessageID"); } 
} 

Hier entsprechender Abschnitt von Viewmodel:

GPHDTModel gphdtModel = new GPHDTModel(); 

public MainWindowViewModel() 
{ 
    gphdtModel.MessageID = "3"; 
} 

So gibt es einen Schlüssel "MessageID" mit einem Wert von MessageID. Ich setze MessageID auf 3, aber der Wert im Wörterbuch bleibt null. Ich habe mich mit dem Ereignis OnPropertyChanged herumgemöbelt und versucht, auch ein ObservableDictionary zu implementieren, aber kein Glück.

+5

"Wie aktualisiere ich die Werte automatisch, wenn ich die Eigenschaften aktualisiere?" - Sie ändern Ihren Property-Setter, so dass er das Dictionary aktualisiert, oder Sie machen Ihre 'OnPropertyChanged'-Methode stattdessen ... Aber im Grunde muss etwas' _fields ["MessageID"] = MessageID; 'oder gleichwertig jedes Mal aufrufen Änderungen ... –

+1

Sie können keinen Schlüssel hinzufügen, der bereits im Wörterbuch vorhanden ist. Sie ersetzen also mit _fields [Schlüsselname] = neuer Wert; – jdweng

Antwort

2

Im Konstruktor Sie hinzufügen, aktuelle Nachrichten-ID Wert zu Wörterbuch (die null ist):

_fields.Add("MessageID", MessageID); 

Sie sollten beachten, dass Sie hier aktuelle Wert von MessageID Eigenschaft hinzufügen. Es ist nicht so, als würde man etwas wie einen Link zur Eigenschaft hinzufügen. Sie fügen nur das Ergebnis des Getter-Aufrufs der Eigenschaft hinzu. Wenn sich der Eigenschaftswert ändert, wird der Wert, der im Wörterbuch gespeichert ist, nicht geändert.

Werte zu synchronisieren, die in der Eigenschaft gespeichert werden und im Wörterbuch sollten Sie Wörterbuch als auch aktualisieren, wenn Eigenschaft wird:

private string _messageID; 
public string MessageID 
{ 
    get { return _messageID; } 
    set { 
     _messageID = value; 
     _fields["MessageID"] = value; // here 
     OnPropertyChanged("MessageID"); 
    } 
} 

können Sie diese Synchronisation loszuwerden, wenn Sie Wörterbuch als die verwenden werden Sicherungsspeicher für Eigenschaften:

public GPHDTModel() 
{ 
    _fields.Add("MessageID", null); // initialize with default value 
} 
public string MessageID 
{ 
    get { return _fields["MessageID"]; } 
    set { 
     if (_fields["MessageID"] == value) 
      return; 

     _fields["MessageID"] = value; 
     OnPropertyChanged("MessageID"); 
    } 
} 
1

Sie benötigen

public string MessageID 
{ 
    get { return _messageID; } 
    set 
    { 
     _messageID = value; 
     Fields["MessageID"] = value 
     OnPropertyChanged("MessageID"); 
    } 
} 
zu tun 10

Grund:
Wenn Sie _fields.Add("MessageID", MessageID); taten, speicherten Sie den Wert im Wörterbuch, aber der Link war nicht da. Wenn Sie also die Eigenschaft aktualisieren, bleibt der Wert im Wörterbuch gleich.

TBH, ich sehe nicht, warum Sie das tun müssen. Da du mvvm getaggt hast, nehme ich WPF an, aber ich verstehe immer noch nicht, warum du das tun musst.

Verwandte Themen