如何使用 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")"方法?

如何使用 MVVM 捕获数据上下文对象属性的修改

我猜你的按钮有一个单击处理程序,它的 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 = ....;
}