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 代码,为您节省一些打字工作,并使代码看起来漂亮干净。
所以我有一个 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 代码,为您节省一些打字工作,并使代码看起来漂亮干净。