【问题标题】:Is there a way to tell if the value of a DependencyProperty came from binding source or target?有没有办法判断 DependencyProperty 的值是来自绑定源还是目标?
【发布时间】:2016-11-12 13:32:45
【问题描述】:

我有时想知道依赖属性的值是来自用户输入还是来自绑定源的更改。 我还没有找到一种干净的方法来确定这一点。

DependencyPropertyHelper 之类的东西,但据我所知,它对这种情况没有帮助。

场景:<TextBox Text="{Binding Foo}" />

找出最后更新Text的绑定源或目标。 或者别的什么,是的,我知道触发器、继承动画等。

【问题讨论】:

    标签: wpf binding dependency-properties


    【解决方案1】:

    是的,您可以获取与依赖属性关联的绑定表达式并检查其状态:

    BindingOperations.GetBindingExpressionBase(textBox, TextBox.TextProperty)?.Status == 
        BindingStatus.Active
    

    您可以将它与DependencyPropertyHelper结合起来检查当前来源是否为BaseValueSource.Local

    ValueSource 还有一个名为IsExpression 的属性,当使用绑定或任何其他表达式(例如DynamicResourceTemplateBinding)时,该属性设置为true

    查找当前值是来自源还是来自目标更难。 AFAIK 没有比这更好的方法了:

    <TextBox Text="{Binding Path=Foo, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"
             SourceUpdated="OnSourceUpdated" TargetUpdated="OnTargetUpdated" />
    

    然后您可以连接处理程序 OnSourceUpdatedOnTargetUpdated 并应用一些逻辑。您还可以创建附加属性并对其进行更新以更好地封装。

    【讨论】:

    • 感谢您的回答,需要尝试一下,看看它是否有效。
    • 当我测试它时,当值来自源和目标时,它都显示Status: Active, BaseValueSource: Local
    • 哦,我不明白你想区分源和目标。有办法,但不漂亮。我会更新我的答案。
    • 请点赞,不幸的是我无法使用NotifyOnSourceUpdatedNotifyOnTargetUpdated,因为我无法控制绑定的创建方式。
    • 我有一个关于克隆绑定和绑定到代理属性的想法。克隆将一团糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多