c# - XAML 中使用 Lambda 表达式和 MVVM 模式的 OneWay/TwoWay 绑定
问题描述
我无法在使用带有表达式的模式时绑定Combobox.SelectedItem
in 。XAML
ViewModel
MVVM
lambda
在我的MainWindow.xaml
我有:
<ComboBox ItemsSource="{Binding Products}" IsEnabled="{Binding ProductsIsEnabled}" SelectedItem="{Binding SelectedProduct}" />
在我MainWindow.xaml.cs
的DataContext
设置中(我的所有其他代码都xaml
可以正常工作)。
在我的MainWindowViewModel.cs
我有:
...
public string TitleText => Title.Text;
...
public ObservableCollection<object> Products => MyConverter.GetCollection(ProductList);
public bool ProductsIsEnabled => MyProduct.IsEnabled;
public object SelectedProduct => ProductList.SelectedItem; // --> this does not work
...
我在运行时收到的错误是
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll
A TwoWay or OneWayToSource binding cannot work on the read-only property 'SelectedProduct' of type 'MyNamespace.MainWindowViewModel'.
我所有的对象都实现了INotifyPropertyChanged
. 有谁知道我在这里错过了什么或做错了什么?
提前致谢!
解决方案
public object SelectedProduct => ProductList.SelectedItem;
是一个简短的形式
public object SelectedProduct
{
get
{
return ProductList.SelectedItem;
}
}
这意味着具有 lambda 表达式的属性是没有设置器的属性;它是一个只读属性。SelectedItem
用户可以更改组合框的值,即用户可以更改SelectedProduct
属性的值。
要修复它,您必须使用属性的设置器,或者您必须以两种方式更改绑定:
<ComboBox ItemsSource="{Binding Products}" IsEnabled="{Binding ProductsIsEnabled}" SelectedItem="{Binding SelectedProduct, Mode=OneWay}" />
单向绑定意味着如果用户更改该属性,该属性将保持不变。仅当您更改属性时,UI 元素才会更改。
附录:在我阅读了您的评论后:您的属性ProductList.SelectedItem
可以有一个 getter 和一个 setter,但这并不意味着您的属性SelectedProduct
将有一个 setter 和一个 getter。将其更改为
public object SelectedProduct
{
get
{
return ProductList.SelectedItem;
}
set
{
ProductList.SelectedItem = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedProduct)));
}
}
它应该可以工作。
推荐阅读
- amazon-web-services - 有什么方法可以在 Athena 数据库中同时运行多个 SQL 查询
- docker - 充当代理的 Docker 注册表不提取图像
- jms - ActiveMQ如何以编程方式重新发送/重试DLQ消息
- java - JSP 测验没有正确记录分数
- python-3.x - 在代码中发现错误以递归方式添加数字,直到它变成一个pallindrom
- google-apps-script - 获取文件夹和子文件夹中的所有文件 Gscript
- c# - 使用 C# 从文本文件中提取特定文本
- python - Pandas - 在列中列出最常见的值以及最常见的子值
- android - Apple DeviceCheck 是否仍然适用于越狱的 iPhone?
- python - 如何从 AWS Glue 脚本中更新/删除雪花