2009-03-12 8 views
2
aktualisiert werden

Ich habe eine Listbox, die zu einer Auflistung von Objekten datengebunden ist. Ich möchte ändern, wie die Elemente angezeigt werden, um dem Benutzer zu zeigen, welches dieser Objekte das START-Objekt in meinem Programm ist.wie Listbox-Elemente mit INotifyPropertyChanged

Ich habe versucht, dies folgendermaßen zu tun, aber die Listbox wird nicht automatisch aktualisiert. Das Invalidieren des Steuerelements hat auch nicht funktioniert.

Der einzige Weg, den ich finden kann, ist, die Datenbindungen vollständig zu entfernen und es wieder hinzuzufügen. aber in meinem Fall ist das nicht wünschenswert.

Gibt es einen anderen Weg?

class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      if (PersonManager.Instance.StartPerson == this) 
       return _name + " (Start)";      
      return _name; 
     } 
     set 
     { 
      _name = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

Dies ist die Klasse weicht die Liste und das Element verwaltet, dass der Start

class PersonManager 
{ 
    public BindingList<Person> persons { get; set; } 
    public Person StartPerson { get; set; } 

    private static PersonManager _instance; 
    public static PersonManager Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new PersonManager(); 
      } 
      return _instance; 
     } 
    } 

    private PersonManager() 
    { 
     persons = new BindingList<Person>(); 
    } 
} 

I

private void button1_Click(object sender, EventArgs e) 
    { 
     PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem; 
    } 

Antwort

2

Ich bin mir ziemlich sicher, verwenden Sie folgenden Code in der Form ist, dass Das Problem ist, dass, wenn Sie dies tun, Sie effektiv machen die Person.Name Eigenschaften "erhalten" Accessor ändern den Wert (und handeln wie ein Set-Accessor, soweit die Benutzeroberfläche betroffen ist).

Allerdings gibt es nichts, das die Bindungen aktualisiert, um zu sagen, dass dies geschieht. Wenn PropertyChanged aufgerufen wurde, wenn Sie start einstellen, glaube ich, dass dies aktualisiert werden würde.

Es ist klobig, aber so, wie Sie es geschrieben haben, ich glaube, Sie diese hinzufügen könnte und es funktioniert (ANMERKUNG: Ich kann das nicht testen habe, so ist es ~ kann ~ haben Probleme):

private void button1_Click(object sender, EventArgs e) 
{ 
    Person newStart = (Person)listBox1.SelectedItem; 
    if (newStart != null) 
    { 
     PersonManager.Instance.StartPerson = newStart; 
     newStart.Name = newStart.Name; // Dumb, but forces a PropertyChanged event so the binding updates 
    } 
} 
+0

Vielen Dank für die schnelle Antwort, die wie ein Zauber wirkte! –

+0

nur um neugierig zu sein, wie hätten Sie dieses Problem gelöst, wenn Sie so etwas von Grund auf neu programmiert hätten? –

+0

Ein potenziell sauberer Weg könnte darin bestehen, etwas wie eine Name + DisplayName-Eigenschaft zu haben. Wenn Sie eine Eigenschaft haben, die bestimmt, ob eine Person die Person "Start" war, würde die Einstellung das Ereignis auslösen. Es gibt viele Optionen - es hängt wirklich davon ab, wie es verwendet wird. –