WPF MVVM 将项目添加到组合框并更改所选项目

WPF MVVM add item to combobox and change selecteditem

所以我有一个 WPF MVVM 应用程序。当我按下一个按钮时,我希望将一个新条目添加到组合框的下拉列表中,并将组合框的选定项目设置为该项目。我可以通过 ObservableCollection 将项目添加到下拉列表中,但我似乎无法正确绑定 SelectedItem。我试过:

<ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />

并将 SelectedItem 直接放在 ViewModel 中,在 ViewModel 中实现 INotifyPropertyChanged。但这不起作用。有什么想法吗?

编辑:我还应该补充一点,OnNotifyPropertyChange 事件确实在我期望的时候正确触发,所以我不确定发生了什么。我也尝试使用 UpdateSourceTrigger=PropertyChanged 无济于事。

谢谢大家,我在 OnNotifyPropertyChanged 中拼写了 属性 错误...真可惜。

只是一个小建议,可以避免您写 属性 错误名称的情况。

如果您使用的是 .net 4.5,则可以在 OnPropertyChanged-方法中使用 CallerMemberName-属性。这看起来像:

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

那么你属性看起来像

public bool MyProperty
{
   get{ return myProperty; }
   set
   {
      myProperty=value;
      OnPropertyChanged();
   }
}

您还可以编写一个方法,从 lambda 表达式中提取 属性name。 base-class 中的方法如下所示:

public static class Helper
{
   public static string GetPropertyName<T>(Expression<Func<T>> expression)
   {
      return ((MemberExpression)expression.Body).Member.Name;
   }
}

属性中的用法看起来像:

public bool MyProperty
{
   get{ return myProperty; }
   set
   {
      myProperty = value;
      OnPropertyChanged(Helper.GetPropertyName(() => MyProperty));
   }
}

通过这种方法,您可以在编译时检查您的 属性-name。

您也可以使用

OnPropertyChanged(nameof(MyProperty));

避免拼写错误。

我开始使用 Fody with PropertyChanged,它会自动注入 OnPropertyChanged 代码,为您节省一些打字工作,并使代码看起来漂亮干净。