2010-03-19 10 views
0

J'ai donc le modèle suivant:ComboBox WPF Reliure

public class Person 
{ 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 
    public String Address { get; set; } 
    public String EMail { get; set; } 
    public String Phone { get; set; } 
} 

public class Order 
{ 
    public Person Pers { get; set;} 
    public Product Prod { get; set; } 
    public List<Person> AllPersons { get; set; } 

    public Order(Person person, Product prod) 
    { 
    this.Pers = person; 
    this.Prod = prod; 
    AllPersons = database.Persons.GetAll(); 
    } 

} 

Et j'ai une fenêtre WPF utilisé pour modifier une commande. Je définis le DataContext sur Order.

public SetDisplay(Order ord) 
{ 
DataContext = ord; 
} 

J'ai le XAML suivant:

<ComboBox Name="myComboBox" 
      SelectedItem = "{Binding Path=Pers, Mode=TwoWay}" 
      ItemsSource = "{Binding Path=AllPersons, Mode=OneWay}" 
      DisplayMemberPath = "FirstName" 
      IsEditable="False" /> 


<Label Name="lblPersonName" Content = "{Binding Path=Pers.FirstName}" /> 
<Label Name="lblPersonLastName" Content = "{Binding Path=Pers.LastName}" /> 
<Label Name="lblPersonEMail" Content = "{Binding Path=Pers.EMail}" /> 
<Label Name="lblPersonAddress" Content = "{Binding Path=Pers.Address}" /> 

Cependant, la liaison ne semble pas fonctionner ....... Quand je change l'élément sélectionné, les étiquettes ne mettent pas à jour .. ..

Cordialement !!

Toute réponse est appréciée !!

+0

Êtes-vous sûr que cette personne est dans la collecte AllPersons? Est-ce que AllPersons.Contains (personne) retourne true dans le constructeur? Je suppose que non! Et n'oubliez pas de marquer les messages utiles comme des réponses, sinon personne ne vous aidera à l'avenir. –

+0

Yep - La personne est sûre à 100% d'être dans la collection AllPersons – MadSeb

Répondre

1

Votre modèle doit générer des notifications de modification. Voir INotifyPropertyChanged et INotifyCollectionChanged. Pour INotifyPropertyChanged, vous pouvez utiliser une classe de base ViewModel, telle que this one. Pour les collections, ObservableCollection<T> fait le travail dur pour vous. Cependant, dans votre cas, votre collection ne changera pas après que l'interface utilisateur y soit liée, donc vous ne devriez pas avoir besoin d'une collection observable. Quoi qu'il en soit, je recommande généralement d'utiliser des collections observables dans votre calque de modèle de vue pour économiser la tête si le code change.

Un exemple de ce que cela ressemblerait est:

public class Person : ViewModel 
{ 
    private string firstName; 
    private string lastName; 
    private string email; 
    private string phone; 

    public string FirstName 
    { 
     get 
     { 
      return this.firstName; 
     } 
     set 
     { 
      if (this.firstName != value) 
      { 
       this.firstName = value; 
       OnPropertyChanged(() => this.FirstName); 
      } 
     } 
    } 

    public string LastName 
    { 
     get 
     { 
      return this.lastName; 
     } 
     set 
     { 
      if (this.lastName != value) 
      { 
       this.lastName = value; 
       OnPropertyChanged(() => this.LastName); 
      } 
     } 
    } 

    // and so on for other properties 
} 

public class Order : ViewModel 
{ 
    private readonly ICollection<Person> allPersons; 
    private Person pers; 
    private Product prod; 

    public Person Pers 
    { 
     get 
     { 
      return this.pers; 
     } 
     set 
     { 
      if (this.pers != value) 
      { 
       this.pers = value; 
       OnPropertyChanged(() => this.Pers); 
      } 
     } 
    } 

    public Product Prod 
    { 
     get 
     { 
      return this.prod; 
     } 
     set 
     { 
      if (this.prod != value) 
      { 
       this.prod = value; 
       OnPropertyChanged(() => this.Prod); 
      } 
     } 
    } 

    // no need for setter 
    public ICollection<Person> AllPersons 
    { 
     get 
     { 
      return this.allPersons; 
     } 
    }  

    public Order(Person person, Product prod) 
    { 
     this.Pers = person; 
     this.Prod = prod; 

     // no need for INotifyCollectionChanged because the collection won't change after the UI is bound to it 
     this.allPersons = database.Persons.GetAll(); 
    } 
}