0

我有一个分配给它的 DataContext 的 WPF 页面。在此页面上,它有几个文本框。每个文本框都绑定到来自 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")”方法?

4

1 回答 1

1

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

路由命令示例:

<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 = ....;
}
于 2012-04-22T16:50:21.670 回答