2010-11-22 27 views
0

Bir ComboBox'a bir nesne listesi bağlarım var.DisplayMemeberPath neden standart bir özelliği kabul etmiyor?

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

comboPerson.ItemsSource = myFriends; 

Ve Standart Özellikler 'kullanırsanız özellik o çalışıyor erişimcileri olsun erişilmişse, o adını görüntüler ancak değildir:

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

Nerede kod arkasında bu gibi görünüyor.

Çalışma versiyon: Burada ne demek olduğunu

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; 
} 

Sigara çalışma versiyonu:

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; 
} 

soru şudur: WPF standart Mülkiyet gelen değeri elde edemiyor neden?

cevap

2

"çalışmayan" sürümünüz Özellikler kullanmıyor, genellikle Encapsulation ihlal edildiğinden kullanmamanız gereken Public Fields kullanıyor. WPF, yalnızca özelliklerine erişim sağlayıcıları üzerinden erişecek şekilde tasarlanmıştır. Alanlara, (doğrudan, {get;set;} sözdizimini kullanırsanız derleyici tarafından oluşturulur) erişim sağlayıcıları tarafından erişilmez. Özellikleri kullanırsanız, otomatik güncelleme (INotifyPropertyChanged'u düzgün bir şekilde uygularsanız) gibi güzel şeylerden de yararlanabilirsiniz.

WPF'de Bağlama kullanmak isterseniz, özellikleri kullanmanız gerekir.

+0

Ancak, sınıf kitaplığı özellikler yerine Alanlar kullanıyorsa ne yapmalıyım? Onlara nasıl bağlarım? – Vitalij

+1

Alanları bağlayamazsınız. Kütüphane sınıfının bir örneğini alan ve alanlarını özellik olarak gösteren bir sarmalayıcı sınıfı yazabilirsiniz. – Botz3000

+0

Sarmalayıcı sınıfımdaki bildirim mekanizmasını almak için her n saniyede bir kitaplıktaki değişiklikleri denetlemeli ve ardından PropertyCnaged olayını yükseltmem gerekiyor mu? – Vitalij

1

İkinci kod, standart özellikler içermiyor, alanları içerir. WPF özelliklerine de ihtiyaç duyarsınız, ayrıca INotifyPropertyChanged'u uygulamalısınız, aksi halde wpf değişmiş verileri yakalamaz.

Başka bir notta: alanları doğrudan gösterme, bunları özelliklerde kapsama. Bunu yaparak, sınıfa girerek veriyi kontrol edebilir, sınıfın dışına kodlamak da sınıfın istenilmeyen şekillerde etkileyemez.

+0

Teşekkürler, alanların kullanımı için iyi bir uygulama olmadığını biliyorum, yalnızca bağlamayı test etmek için alanlar kullandım, ancak WPF'nin alanları kullanamayacağını anladım. – Vitalij

İlgili konular