WPF MVVM可编辑组合框新值为空

本文关键字:新值 组合 MVVM 编辑 WPF | 更新日期: 2023-09-27 18:08:14

在这里尝试了所有类似问题的解决方案,仍然没有成功。我有一个ComboBox,应该为选择现有项目和/或添加新项目工作。只有选定的项目部分有效。范畴只是一个具有NameId的对象。

提前感谢!

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

WPF MVVM可编辑组合框新值为空

您的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}",因此无论SelectedCategory的值是什么,Text属性将始终反映NewCategory的名称。

NewCategory为null时,Text属性没有什么可绑定的,因此不能执行双向绑定(也就是说,Text属性的值不能传递回NewCategory.Name,因为这会导致NullReferenceException(因为NewCategory为null)。

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

创建新变量以保留组合框的文本。如果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; });
            }
        }