2

在我的 WPF 应用程序中,我有一个CheckBoxIsChecked值绑定到我的视图模型中的属性。请注意,我已经注释掉了在我的视图模型中设置值的实际行。这是标准模式:

查看.xaml

<CheckBox IsChecked="{Binding Path=SomeProperty}" />

视图模型.cs

public bool SomeProperty
{
    get { return this.mSomeProperty; }
    set
    {
        if (value != this.mSomeProperty)
        {
            //this.mSomeProperty = value;
            NotifyPropertyChanged(new PropertyChangedEventArgs("SomeProperty"));
        }
    }
}

当我单击时,CheckBox我希望什么都不会发生,因为this.mSomeProperty没有设置值。然而,观察到的行为是,CheckBox无论 的值如何,都会检查和取消检查this.mSomeProperty

到底是怎么回事?为什么我的绑定不强制CheckBox显示底层数据模型的设置?

4

1 回答 1

3

因为 WPF 在更新源后不会自动从绑定源重新加载。这可能部分是出于性能原因,但主要是为了处理绑定失败。例如,考虑绑定到整数属性的 TextBox。假设用户键入 123A。WPF 希望继续显示用户键入的内容以便他们可以更正它,而不是突然将 TextBox 内容重置为属性的旧值。

所以当你单击 CheckBox 时,WPF 假定它应该继续显示控件状态,而不是重新检查绑定的属性。

我发现的唯一方法(不是很优雅)是在WPF 从调用属性设置器返回后引发 PropertyChanged。这可以使用 Dispatcher.BeginInvoke 来完成:

set
{
  // ...actual real setter logic...
  Action notify = () => NotifyPropertyChanged(...);
  Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, notify);
}

通过将其合并到 NotifyPropertyChanged 实现中,这可能会变得不那么可怕,这样您就不必因为这个实现问题而污染各个属性。您也许还可以使用 NotifyOnSourceUpdated 和 SourceUpdated 附加事件,但我还没有探索过这种可能性。

于 2010-03-08T20:55:06.153 回答