【问题标题】:WPF data binding with delimited path, not updating target带有分隔路径的 WPF 数据绑定,不更新目标
【发布时间】:2013-02-11 11:56:22
【问题描述】:

我有一个自定义的 WPF 用户控件,它有一个依赖属性(下面的 sn-p)。哪个没有正确触发它的 PropertyChangedCallback。

自定义控件:

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(
        "Value", typeof(float?), typeof(CustomControl),
        new UIPropertyMetadata(new PropertyChangedCallback(OnDependencyPropertyChanged)));

public float? Value
{
    get { return (float?)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

private static void OnDependencyPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
   // Do something
}

当我使用简单路径绑定到属性时,一切都很好。但是,当我使用分隔路径语法时,依赖属性不会在应该更新的时候更新。

工作绑定:

<namespace:CustomControl Value={Binding ViewModelProperty}/>

绑定无效:

<namespace:CustomControl Value={Binding ViewModelProperty.ObjectProperty}/>

使用工作语法,调用 OnDependencyPropertyChanged 事件处理程序以响应视图模型触发的 ViewModelProperty 的 PropertyChanged 事件。但是,对于第二种语法,OnDependencyPropertyChanged 事件处理程序仅在更改 ObjectProperty 时调用,而不是在更改 ViewModelProperty 时调用。我是否需要进行任何其他设置才能使分隔 (.) 路径语法正常工作? (与 TextBox.Text 等属性默认具有相同的行为)

【问题讨论】:

  • 您确定在第二种情况下为 ViewModelProperty 触发了 PropertyChanged 事件吗?新的ViewModelProperty 是否有可能与旧的ObjectProperty 包含相同的值?在这种情况下,绑定不会被更新。
  • 是的,在第二种情况下,肯定会为 ViewModelProperty 触发 PropertyChanged 事件。之前和之后的 ObjectProperty 值具有相同的“float”也是如此?值,但我仍然希望回调发生(对于 TextBox.Text 可观察到等价物)。正如您在下面所说的“只要有 ViewModelProperty 的更改通知,绑定就会更新”。
  • ObjectProperty 包含相同的float 值时,您如何观察到TextBox.Text 已更新?最后,您的 PropertyChangedCallback 不会仅仅因为属性值没有改变而被调用。
  • 作为 TextBox.Text 更新的示例,即使该值实际上并未更改,请考虑将 Text 绑定到 ViewModelProperty.ObjectProperty,如果输入了非数字值,则验证失败并且 ObjectProperty 未更新,但是如果触发“ViewModelProperty”PropertyChanged 事件,则文本框将重置为 ObjectProperty 的值(即使在“ViewModelProperty”PropertyChanged 事件之前和之后的值相同)
  • 是的,但那是完全不同的情况。我们在这里讨论的是一种单向绑定,其中源属性被通知更改,但实际上并没有更改其值。

标签: wpf data-binding dependency-properties


【解决方案1】:

您是否尝试过使用 Path 属性进行绑定?

<nmspc:CustomControl Value="{Binding Path=ViewModelProperty.ObjectProperty}" />

我记得当以编程方式构建双向绑定时,Path 属性是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多