2011-01-11 5 views
2

Я всегда полностью убегаю этих ComboBoxes. Я думаю, что понимаю их, но, похоже, я этого не делаю.ComboBox TwoWay binding не работает

Я не могу дать объекту родителя. Таким образом, у меня есть этот дочерний объект, у него есть значение, которое является идентификатором родителя, и у меня есть коллекция родительских элементов.

Я выбираю родителя из ComboBox, и если я правильно понимаю, что свойство ID должно быть привязано к свойству ParentId Child. Кажется хорошо, когда я выбираю его, свойство переходит. Шаблон изменен, и он отображается как текстовый блок, все в порядке. когда шаблон возвращается в тип ComboBox внезапно, это Null. Должен ли он найти сопоставимый элемент в коллекции, где его идентификатор соответствует ParentId?

Вот код:

РОДИТЕЛЕЙ

public class Parent 
{ 
    private string _id; 
    public string Id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
} 

РЕБЕНОК

public class RulesMainClassViewModel : ViewModelBase 
{ 
    private string _id; 
    public string Id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

     private string _parentId; 
    public string ParentId 
    { 
     get 
     { 
      return _parentId; 
     } 
     set 
     { 
      _parentId = value; 
      OnPropertyChanged("ParentId"); 
     } 
    } 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
} 

XAML выпадающий

<ComboBox DisplayMemberPath="Name" SelectedValue="{Binding Path=ParentId, Mode=TwoWay}" 
SelectedValuePath="Id" ItemsSource="{Binding Path=ParentCollection}" /> 
+0

Это ошибка в WPF его называют каскадом проблемы выпадающей, если вы заметили, тщательно , когда переменные itemssource, к сожалению, combobox устанавливает SelectedIndex на -1, что приводит к тому, что SelectedValue очищает и освобождает привязку. –

+0

@Akash Это так? Это то, что было исправлено в .Net 4. И я не верю, что ItemsSource изменился в моем примере. –

+1

Его еще не исправлено в .NET 4. ComboBox имеет проблемы с привязками при изменении ItemsSource, ItemsSource привязан к коллекции, и если какой-либо элемент добавлен или удален, ComboBox пытается обновить SelectedValue, однако, если есть небольшой шанс, что он будет не найти выбранное значение, он установит SelectedIndex равным -1, и он потеряет привязку. –

ответ

0

Не уверен, что ваша полная установка, как (и я могу действительно говорить шляпа ошибочна с вашим кодом), но я попытался смоделировать нечто похожее, которое имеет общее применение, я сделал ListView, который связывается с коллекцией сотрудников, у которых есть Name и Occupation. ComboBox имеет целью изменения Occupation выбранного работника, XAML для этого выглядит следующим образом:

<ComboBox ItemsSource="{Binding Occupations}" 
       SelectedValue="{Binding ElementName=lv,Path=SelectedItem.Occupation}" 
       SelectedValuePath="{Binding Occupation.Title}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Title}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

Это похоже на работу. Обратите внимание, что мой SelectedValuePath является обязательным, может быть, это проблема ...


(коды класса :)

public class Employee : INotifyPropertyChanged 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; 
     NotifyPropertyChanged("Name");} 
    } 

    private Occupation occupation; 
    public Occupation Occupation 
    { 
     get { return occupation; } 
     set { occupation = value; 
     NotifyPropertyChanged("Occupation");} 
    } 

    public Employee(string name, Occupation occupation) 
    { 
     this.name = name; 
     this.occupation = occupation; 
    } 

    #region INotifyPropertyChanged Members 
    ... 
    #endregion 
} 

public class Occupation : INotifyPropertyChanged 
{ 
    private string title; 
    public string Title 
    { 
     get { return title; } 
     set { title = value; 
     NotifyPropertyChanged("Title");} 
    } 

    public Occupation(string title) 
    { Title = title; } 

    #region INotifyPropertyChanged Members 
    ... 
    #endregion 
} 
+0

Не выбраноValueПочтите часть из элемента источника, который вы используете в привязке? И SelectedValue - часть объекта, к которому вы привязаны? Должен признаться, я не вижу, к чему привязывается ваш SelectedValuePath. Является ли это занятие собственностью где-то? Если это свойство на Работнике, почему бы вам не добавить туда имя элемента. Является ли ваша коллекция (itemsSource) коллекцией строк или коллекций объектов занятий? –

+0

Это коллекция сотрудников, у которых есть свойство Name: string и Occupation, Occupation - это объект, состоящий только из свойства Title, как вы можете видеть в коде.Я предлагаю вам попытаться привязать ваш путь SelectedValue к свойству внутри класса item-class или к одному из его под-свойств, как я сделал (Occupation.Title). –

Смежные вопросы