我有一个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“)”方法?
答案 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 = ....;
}