如何使用MVVM捕获DataContext对象属性的修改?

时间:2012-04-22 16:21:32

标签: c# wpf binding mvvm .net-4.0

我有一个WPF页面,其中分配了一个DataContext。在这个页面上它有几个文本框。每个文本框都绑定到DataContext中父对象的属性。例如,DataContext上有一个Location对象。 Location对象具有“Name”和“Address1”等属性。

文本框控件的绑定方式如下:

<Binding Path="Location.Name" Mode="TwoWay">

我有一个“提交”按钮,只有在所有数据都有效后才会启用。这依赖于在设置属性后对此过程的评估。如果这不是Location的子属性,我可以轻松地这样做:

public Location Location
{
    get { return _location; }
    set
    {
        _location = value;
        OnPropertyChanged("Location");
        OnPropertyChanged("IsCommitEnabled");
    }
}

但由于Location对象实际上从未设置过,而是Location对象的“Name”属性,因此该事件永远不会触发。有没有办法在我的Location对象的属性被修改/设置时触发我的“OnPropertyChanged(”IsCommitEnabled“)”方法?

1 个答案:

答案 0 :(得分:1)

我猜你的按钮有一个Click处理程序,它的Enabled属性绑定到IsCommitEnabled。除了您负责更新启用状态外,这是正常的 - 这是您表达的问题 另一种方法是将Click处理程序和Enabled绑定替换为对Command的绑定。 您可以将命令作为RoutedCommand并将CanExecuteRoutedEventArgs.CanExecute设置为IsCommitEnable,或者您可以提供ICommand的实现,其中ICommand.CanExecute将检查IsCommitEnabled。 在这两种情况下框架都会在轮询CanExecute方法之后进行调查 - 因此您不必在属性更改时进行属性更新

RoutedCommand示例:

<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 = ....;
}