2010-11-22 8 views
0

Je lie une liste d'objets à un ComboBox.Pourquoi DisplayMemeberPath n'accepte pas une propriété standard?

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

Lorsque le code regarde derrière comme ceci:

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

comboPerson.ItemsSource = myFriends; 

Et si je l'utilise Propriétés standart, il ne montre pas le nom mais, si la propriété est accessible via get accesseurs il fonctionne. Voici ce que je veux dire:

version de travail:

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

Non version de travail:

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

La question est: pourquoi WPF ne parvient pas à obtenir la valeur d'une propriété standard?

Répondre

2

votre version "ne fonctionne pas" n'utilise pas les propriétés, elle utilise des champs publics, que vous ne devriez pas utiliser normalement parce que cela viole Encapsulation.

WPF est conçu pour accéder uniquement aux propriétés via leurs accesseurs. Les champs ne sont pas accessibles via des accesseurs (qui sont générés par le compilateur si vous utilisez la syntaxe {get;set;}), mais directement. Si vous utilisez des propriétés, vous pouvez également profiter de choses intéressantes comme la mise à jour automatique (si vous implémentez correctement INotifyPropertyChanged). Par conséquent, si vous souhaitez utiliser la liaison dans WPF, vous devez utiliser les propriétés.

+0

Mais que dois-je faire si la bibliothèque de classes utilise des champs au lieu de propriétés? Comment puis-je lier à ceux alors? – Vitalij

+1

Vous ne pouvez pas lier à des champs. Vous pouvez écrire une classe wrapper qui prend une instance de la classe de bibliothèque et expose ses champs en tant que propriétés. – Botz3000

+0

Et pour obtenir le mécanisme de notification dans ma classe wrapper dois-je vérifier les changements dans la bibliothèque toutes les n secondes, puis augmenter l'événement PropertyCnaged? – Vitalij

1

Le deuxième code ne contient pas de propriétés standard, il contient des champs. WPF a besoin de propriétés, vous devez également implémenter INotifyPropertyChanged, sinon wpf n'attrapera pas les données modifiées. Sur une autre note: n'exposez pas les champs directement, encapsulez-les dans les propriétés. En faisant cela, vous pouvez contrôler l'entrée des données dans la classe, aussi le code en dehors de la classe elle-même ne peut pas influencer la classe de manière non désirée.

+0

Merci, je sais que ce n'est pas une bonne pratique d'utiliser des champs, j'ai utilisé des champs uniquement pour tester la liaison, mais j'ai ensuite réalisé que WPF ne peut pas utiliser les champs. – Vitalij