2013-04-09 57 views
0

尝试了解周围类似问题的所有解决方案,仍然没有去。我有一个ComboBox应该适用于选择现有项目和/或添加新项目。只有选定的项目部分起作用。类别只是带有NameId的对象。WPF MVVM可编辑的组合框新值为空

在此先感谢!

XAML

<ComboBox Name="CbCategory" ItemsSource="{Binding Categories}" 
    SelectedItem="{Binding SelectedCategory.Name, UpdateSourceTrigger=PropertyChanged}" 
    Text="{Binding NewCategory.Name}" DisplayMemberPath="Name" 
    IsEditable="True"/> 

Code behind

private Category _selectedCategory; 

public Category SelectedCategory 
{ 
    get { return _selectedCategory; } 

    set 
    { 
     if (Equals(_selectedCategory, value)) return; 
     _selectedCategory = value; 
     SendPropertyChanged("SelectedCategory"); 
    } 
} 

private Category _newCategory; 

public Category NewCategory 
{ 
    get { return _newCategory; } 

    set 
    { 
     if (Equals(_newCategory, value)) return; 
     _newCategory = value; 
      SendPropertyChanged("NewCategory"); 
    } 
} 

回答

1

Text绑定不工作,因为你对一个nullCategory属性绑定。实例化它。

public Category NewCategory 
{ 
    get { return _newCategory ?? (_newCategory = new Category()); } 
    set 
     { 
      if (Equals(_newCategory, value)) return; 
      _newCategory = value; 
      SendPropertyChanged("NewCategory"); 
     } 
} 

编辑:阐述按您的评论:

ComboBox.Text结合设置为"{Binding NewCategory.Name}",所以无论什么SelectedCategory值,该Text属性将始终反映NewCategory的名字。

NewCategory为空,则Text属性无关地结合,并且因此不能被执行2路的结合(即,Text属性的值不能被传递回NewCategory.Name,因为这将导致NullReferenceException(因为NewCategory为空)。

这并不影响SelectedItem的情况下,因为这是直接绑定到SelectedCategory财产,而不是一个子属性。

+0

whicked!它的工作......但我只是想明白为什么?我的意思是,在selectedCategory中也没有实例化,但它的工作原理......你能解释一下吗? – Salty 2013-04-09 20:55:34

+0

@EricSharp看我的编辑。 – 2013-04-09 20:58:45

+0

太棒了,像雨一样清晰!非常感谢您的帮助! – Salty 2013-04-09 21:01:21

0

创建新varible保持组合框的文本。如果selectedItem havi NG空值获得组合框的文本作为新的项目,

代码:

<ComboBox Name="CbCategory" ItemsSource="{Binding Categories}" 
    SelectedItem="{Binding SelectedCategory.Name, UpdateSourceTrigger=PropertyChanged}" 
    Text="{Binding Name}" DisplayMemberPath="Name" 
    IsEditable="True"/> 

private String _name; 
public Category Name 
{ 
    get { return _name; } 

    set 
    {   
     _name = value 
     SendPropertyChanged("Name"); 
    } 
} 

public ICommand ItemChange 
{ 
get 
{ 
    `return new RelayCommand(() =>`{ 
        try{string item = this.SelectedCategory.Code;} 
catch(Exception ex){string item = this.Name;} 
       },() => { return true; }); 
      } 
     }