如何使用 MVVM 捕获数据上下文对象属性的修改
本文关键字:对象 属性 修改 上下文 数据 何使用 MVVM | 更新日期: 2023-09-27 18:31:59
我有一个分配了DataContext的WPF页面。在此页面上,它有几个文本框。每个文本框都绑定到数据上下文中的父对象的属性。例如,DataContext 上有一个 Location 对象。位置对象具有"名称"和"地址 1"等属性。
文本框控件的绑定方式如下:
<Binding Path="Location.Name" Mode="TwoWay">
我有一个"提交"按钮,只有在所有数据都有效后才会启用。这依赖于在设置属性后对此过程的评估。如果这不是位置的子属性,我可以轻松地这样做:
public Location Location
{
get { return _location; }
set
{
_location = value;
OnPropertyChanged("Location");
OnPropertyChanged("IsCommitEnabled");
}
}
但是,由于从未实际设置 Location 对象,而是设置 Location 对象的"Name"属性,因此该事件永远不会触发。有没有办法在修改/设置位置对象的属性时触发我的"OnPropertyChanged("IsCommitEnabled")"方法?
我猜你的按钮有一个单击处理程序,它的 Enabled 属性绑定到 IsCommitEnabled。 这很好,除了您负责更新启用状态 - 这是您表达的问题。
另一种方法是将 Click 处理程序和已启用绑定替换为对命令的绑定。您可以将命令作为 RoutedCommand 进行暗示,并将 CanExecuteRoutedEventArgs.CanExecute 设置为 IsCommitEnable,或者您可以提供 ICommand,其中 ICommand.CanExecute 将检查 IsCommitEnabled。
在这两种情况下,框架都会轮询 CanExecute 方法 - 因此您不必在属性更改时进行属性更新。
路由命令示例:
<Window.CommandBindings>
<CommandBinding
Command="{x:Static p:Window1.StartButtonCommand}"
Executed="buttonStart_Executed"
CanExecute="CommandBinding_StartButtonEnabled" />
</Window.CommandBindings>
public static RoutedCommand StartButtonCommand = new RoutedCommand();
private void CommandBinding_StartButtonEnabled(object sender, CanExecuteRoutedEventArgs e) {
e.CanExecute = ....;
}