2013-04-09 78 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; }); 
      } 
     }