2016-11-25 1 views
0

Ich habe ein paar ListViews, die auf den Inhalt von Dictionary<string,string> s abhängen. Ich habe auch eine Funktion pro Wörterbuch für die Aktualisierung der zugehörigen ListView. Diese müssen jedoch manuell aufgerufen werden und dies kann alle Arten von Problemen verursachen, wenn sie vergessen werden. Ist es möglich, eine Funktion aufzurufen, wenn ein Wert in einem Wörterbuch geändert wird?Funktion ausführen, wenn Wörterbuch Inhalt ändert

Meine ersten Gedanken waren zu verwenden DataBinding, aber Listview unterstützt dies nicht in WinForms oder einige benutzerdefinierte Ereignisse zu erhöhen, aber ich würde nicht einmal wissen, wo ich damit anfangen soll.

Gibt es eine einfache Möglichkeit, dies zu erreichen?

Nur zur Klarstellung Ich spreche über etwas, das diesen Effekt hat:

Dictionary[key] = "this"; //Automatically runs UpdateDictionaryBox(); 
Dictionary.Add(key,value); //The same 
Dictionary.Remove(key); //And again 
+2

So etwas wie ein ['ObservableDictionary'] (http://blogs.microsoft.co.il/shimmy/2010/12/26/observabledictionarylttkey-tvaluegt-c/)? –

+0

Warum nicht 'DataGridView' verwenden, das an eine' BindingList 'gebunden ist, wo T' INotifyPropertyChanged' implementiert? –

+1

Normalerweise können Sie solche Dinge durch Kapselung und einzelne Verantwortlichkeitsklassen vermeiden. Wenn Sie eine Klasse haben, die dieses Wörterbuch enthält, und das wäre privat, könnte niemand darauf zugreifen, außer dieser Klasse. Dann könnten Sie Eigenschaften/Methoden zum Ändern, Hinzufügen oder Entfernen von Elementen bereitstellen. Dies ist der einzige Ort, an dem Sie damit umgehen müssen, z. durch das Auslösen eines benutzerdefinierten Ereignisses, das bearbeitet werden kann, könnten Sie 'UpdateDictionaryBox' aufrufen –

Antwort

0

All Kredit Tim Schmelter als seine Bemerkung führte mich zu dieser Lösung!

Im Wesentlichen ist die einfachste Methode, eine Wrapper-Klasse um die Dictionary<string,string> zu erstellen und die ListView dann diese verwenden, um alle Wörterbuch Methoden zu implementieren, die erforderlich sind, und rufen Sie das Update am Ende .Add, .Remove[key] = value usw.

Auf diese Weise emuliert die Klasse, sobald die Klasse korrekt implementiert ist, die Datenbindung.

Meine resultierende Klasse ist:

class DictionaryListViewPseudoBinder : IEnumerable 
{ 
    private ListView ListView { get; } 
    private Dictionary<string,string> Dictionary { get; set; } 

    public DictionaryListViewPseudoBinder(ListView listView) 
    { 
     ListView = listView; 
     Dictionary = new Dictionary<string, string>(); 
    } 

    public string this[string key] 
    { 
     get 
     { 
      return Dictionary.ContainsKey(key) ? Dictionary[key] : ""; 
     } 
     set 
     { 
      if (Dictionary.ContainsKey(key)) 
      { 
       Dictionary[key] = value; 
       RepopulateListView(); 
      } 
      else 
      { 
       MessageBox.Show("Dictionary does not contain key " + key + " aborting..."); 
      } 
     } 
    } 
    public void Add(string key, string value) 
    { 
     if (!Dictionary.ContainsKey(key)) 
     { 
      Dictionary.Add(key, value); 
      RepopulateListView(); 
     } 
     else 
     { 
      MessageBox.Show(string.Format("The Entry \"{0}\" already exists in {1}",key,ListView.Name)); 
     } 
    } 

    public void Remove(string key) 
    { 
     if (Dictionary.ContainsKey(key)) 
     { 
      Dictionary.Remove(key); 
     } 
    } 

    public bool ContainsKey(string key) 
    { 
     return Dictionary.ContainsKey(key); 
    } 

    public bool ContainsKVP(KeyValuePair<string, string> kvp) 
    { 
     if (!Dictionary.ContainsKey(kvp.Key)) 
     { 
      return false; 
     } 
     else 
     { 
      return Dictionary[kvp.Key] == kvp.Value; 
     } 
    } 
    private void RepopulateListView() 
    { 
     ListView.Items.Clear(); 
     foreach (KeyValuePair<string, string> kvp in Dictionary) 
     { 
      ListView.Items.Add(kvp.Key).SubItems.Add(kvp.Value); 
     } 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return Dictionary.GetEnumerator(); 
    } 
} 

NB: Die oben noch nicht vollständig getestet ist und nicht alle Methoden sind vollständig zu diesem Zeitpunkt umgesetzt, aber es zeigt den allgemeinen Rahmen, die für diese Funktionalität.

+0

Verwenden Sie nicht die Prüfung enthalten mit einem Wörterbuch, es verursacht zwei Nachschlagevorgänge eine für die enthält und eine für die Operation innerhalb der Wenn.Verwenden Sie stattdessen die try-Methoden (TryAdd usw.). –

Verwandte Themen