【问题标题】:Dependency Property on a user control not updating the property when bound data changes绑定数据更改时,用户控件上的依赖属性不更新属性
【发布时间】:2016-11-18 15:04:45
【问题描述】:

我见过其他人偶尔会遇到这个问题,我可以说我已经复制了他们修复的几个变体,但还没有让它起作用。

我知道我的绑定数据正在发送正确的 INotify 事件,因为我可以将其他控件绑定到文本块等数据,并在对象属性更改时看到其内容更改,但我的用户控件似乎根本没有接收到事件。

public partial class MappingSelector : UserControl
{
    public Type OutputDriver
    {
        get { return (Type)GetValue(OutputDriverProperty); }
        set { Console.WriteLine(value.ToString()); SetValue(OutputDriverProperty, value); UpdateUI(); }
    }

    // Using a DependencyProperty as the backing store for OutPutDriver.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty OutputDriverProperty =
        DependencyProperty.Register("OutputDriver", typeof(Type), typeof(MappingSelector), new PropertyMetadata(null));
    public MappingSelector()
    {
        InitializeComponent();
        (this.Content as FrameworkElement).DataContext = this;
        //UpdateUI();
    }
}

setter 有一个永远不会触发的控制台跟踪,所以我确信该属性永远不会被设置。

然后我使用以下方式绑定到它:

<root:MappingSelector OutputDriver="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/>

而且我知道LoadedProfile.UsedDriverInterface 正在更新并发送正确的事件,因为我也有这个工作正常:

<TextBlock Text="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/>

后期编辑: 这行得通,但这真的是我需要做的吗?没有更好的办法吗? 将此添加到用户控件构造函数中;

        var OutputDriverDPD = DependencyPropertyDescriptor.FromProperty(OutputDriverProperty, typeof(MappingSelector));
        OutputDriverDPD.AddValueChanged(this, (sender, args) =>
        {
            OutputDriver = (Type)GetValue(OutputDriverProperty);
        });

【问题讨论】:

    标签: c# wpf data-binding dependency-properties


    【解决方案1】:

    setter 有一个永远不会触发的控制台跟踪,所以我确信该属性永远不会被设置。

    这是一个陷阱。您定义的属性 getter 和 setter 是为了您的方便。 WPF 框架不会调用它们,它会直接使用依赖属性。永远不要在那些你需要完成的 getter 和 setter 中做任何事情。

    如果您想对属性更改做出反应,请使用您已经发现的回调。您的控制台跟踪应该在其中,而不是在 setter 中。

    【讨论】:

    • 知道了,所以使用 DP 作为我所有事件和条件的“中心”,并且只使用该属性在控件内进行绑定?
    • @Wobbles 是的,get/set 属性只适合你,框架将使用 DP。
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2021-08-26
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多