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

您的TextBinding 不起作用,因为您正在绑定一个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}",因此无论 的值SelectedCategory是什么,该Text属性都将始终反映 的名称NewCategory

NewCategory为 null 时,该Text属性没有可绑定的内容,因此无法执行 2-way 绑定(即Text无法将属性的值传回给NewCategory.Name,因为那样会导致一个NullReferenceException(因为NewCategory为 null)。

这不会影响 的情况SelectedItem,因为它直接绑定到SelectedCategory属性,而不是它的子属性。

于 2013-04-09T20:50:52.283 回答
0

创建新变量以保留组合框的文本。如果 selectedItem 具有 null 值,则将组合框的文本作为新项目,

代码 :

<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 回答