WPF ComboBox Binding - PullRequest
       5

WPF ComboBox Binding

0 голосов
/ 19 марта 2010

Итак, у меня есть следующая модель:

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

}

И у меня есть окно WPF, используемое для редактирования заказа. Я установил для DataContext значение Order.

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

У меня есть следующий XAML:

<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}" />

Однако привязка не работает ....... Когда я меняю выбранный элемент, ярлыки не обновляются ....

Привет !!

Любой ответ приветствуется!

1 Ответ

1 голос
/ 19 марта 2010

Ваша модель должна будет активировать уведомления об изменениях.См. INotifyPropertyChanged и INotifyCollectionChanged.

Для INotifyPropertyChanged вы можете использовать базовый класс ViewModel, такой как этот .Для коллекций ObservableCollection<T> делает тяжелую работу за вас.Однако в вашем случае ваша коллекция не изменится после того, как к ней будет привязан пользовательский интерфейс, поэтому вам не нужна наблюдаемая коллекция.Несмотря на это, я бы вообще рекомендовал использовать наблюдаемые коллекции в слое модели представления, чтобы сохранить царапины на голове, если код когда-либо изменится.

Пример того, как это будет выглядеть:

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(); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...