0

ここで同様の問題に対するすべての解決策を試しましたが、まだうまくいきません。既存のアイテムの選択および/または新しいアイテムの追加に使用できるがComboBoxあります。選択した項目部分のみが機能します。Nameカテゴリは、とを持つ単なるオブジェクトIdです。

前もって感謝します!

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");
    }
}   
4

2 に答える 2

1

プロパティTextに対してバインドしているため、バインディングが機能しません。null Category代わりにインスタンス化してください。

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

編集:あなたのコメントに従って詳しく説明します:

バインディングComboBox.Textが に設定されて"{Binding NewCategory.Name}"いるため、 の値が何であってもSelectedCategoryTextプロパティは常に の名前を反映しますNewCategory

NewCategoryが null の場合、プロパティにはバインド先がないためText、双方向バインディングを実行できません (つまり、Textプロパティの値を に戻すことはできませNewCategory.Nameん。NullReferenceExceptionNewCategory

SelectedItemこれは、プロパティに直接バインドされ、そのSelectedCategoryサブプロパティではないため、 のケースには影響しません。

于 2013-04-09T20:50:52.283 に答える
0

コンボボックスのテキストを保持する新しい変数を作成します。null値を持つselectedItemがコンボボックスのテキストを新しいItemとして取得する場合、

コード :

<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; });
            }
        }
于 2014-09-17T09:04:29.567 に答える