2010-11-22 17 views
0

Ich binde eine Liste von Objekten an eine ComboBox.Warum DisplayMeeperPath keine Standardeigenschaft akzeptiert?

<ComboBox Name="comboPerson" DisplayMemberPath="Name"/> 

Wo Code sieht hinter wie folgt aus:

List<Person> myFriends = new List<Person>() 
{ 
    new Person("Jack", "Daniels", 8), 
    new Person("Milla", "Jovovovich", 35), 
    new Person("Umma", "Turman", 34) 
}; 

comboPerson.ItemsSource = myFriends; 

Und wenn ich standart Eigenschaften verwenden, ist es nicht den Namen angezeigt werden, sondern, wenn die Immobilie über get zugegriffen wird Accessoren es funktioniert. Hier ist, was ich meine:

Arbeitsversion:

public string Name { get; set; } 
public string Surnamge { get; set; } 
public int Age { get; set; } 

public Person(string name, string surname, int age) 
{ 
    this.Name = name; 
    this.Surnamge = surname; 
    this.Age = age; 
} 

Nicht funktionierende Version:

public string Name; 
public string Surnamge; 
public int Age; 

public Person(string name, string surname, int age) 
{ 
    this.Name = name; 
    this.Surnamge = surname; 
    this.Age = age; 
} 

Die Frage ist: warum WPF ist nicht in der Lage, den Wert von einem Standard-Property zu erhalten?

Antwort

2

Ihre "nicht funktionierende" Version verwendet keine Eigenschaften, sie verwendet öffentliche Felder, die Sie normalerweise nicht verwenden sollten, da sie gegen Encapsulation verstoßen.

WPF ist so konzipiert, dass es nur über seine Accessoren auf Eigenschaften zugreift. Der Zugriff auf Felder erfolgt nicht über Accessoren (die vom Compiler generiert werden, wenn Sie die Syntax {get;set;} verwenden), sondern direkt. Wenn Sie Eigenschaften verwenden, können Sie auch schöne Dinge wie die automatische Aktualisierung nutzen (wenn Sie INotifyPropertyChanged richtig implementieren).

Wenn Sie also Bindung in WPF verwenden möchten, müssen Sie Eigenschaften verwenden.

+0

Aber was soll ich tun, wenn die Klassenbibliothek Felder statt Eigenschaften verwendet? Wie binde ich dann an diese? – Vitalij

+1

Sie können nicht an Felder binden. Sie könnten eine Wrapperklasse schreiben, die eine Instanz der Bibliotheksklasse übernimmt und ihre Felder als Eigenschaften verfügbar macht. – Botz3000

+0

Und um Benachrichtigungsmechanismus in meiner Wrapperklasse zu erhalten, muss ich alle n Sekunden nach Änderungen in der Bibliothek suchen und dann das PropertyCnaged-Ereignis erhöhen? – Vitalij

1

Der zweite Code enthält keine Standardeigenschaften, er enthält Felder. WPF benötigt Eigenschaften, auch sollten Sie INotifyPropertyChanged implementieren, sonst wird WPF keine geänderten Daten erfassen.

In einem anderen Hinweis: Felder nicht direkt verfügbar machen, kapseln sie in Eigenschaften. Dadurch können Sie steuern, dass die Daten in die Klasse gelangen, auch Code außerhalb der Klasse selbst kann die Klasse nicht auf unerwünschte Weise beeinflussen.

+0

Danke, ich weiß, dass es keine gute Praxis ist, Felder zu verwenden, ich habe nur Felder verwendet, um die Bindung zu testen, aber dann erkannte ich, dass WPF Felder nicht verwenden kann. – Vitalij

Verwandte Themen