【问题标题】:Subscribing to an event of a Binding class in custom MarkupExtension在自定义 MarkupExtension 中订阅 Binding 类的事件
【发布时间】:2012-01-27 22:14:04
【问题描述】:

我正在编写一个能够接受 PropertyPath 的 MarkupExtension。我希望能够订阅给定属性 PropertyPath 的“更改”事件(DependencyProperty 或通过 INotifyPropertyChanged 更新的事件)实际上不会调用源属性。

我的代码目前如下所示:

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding();
        binding.Path = Path;
        ...

        return false;
    }

但我不确定如何继续从绑定对象获取通知更改。如果我将绑定连接到任何 DependencyProperty,它将自动调用源属性 getter,这是我试图避免的。

似乎我可以以某种方式使用 Binding.SourceUpdatedEvent,但是,由于它是一个附加的路由事件,我不确定如何从 MarkupExtension 订阅它。

谢谢!

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    看看this SO question

    这个想法是用一个 DP 创建一个类,提供它并让 WPF 处理属性路径,然后检索出来的值。

    如果这不令人满意,您正在考虑反思(很多)。

    【讨论】:

    • 感谢您的意见。我看到了这个问题,但问题是我试图获得有关 Source 更改的通知,而没有实际调用源的 getter。这个解决方案的问题是绑定到 PropertyPath 的 DP 实际上会检索该值,而我只想知道该值已更改。
    【解决方案2】:

    如果 Binding 和 DependancyProperty 是您的解决方案,并且您担心不调用 getter,则可以将绑定模式指定为 OneWayToSource.

    {Binding Mode=OneWayToSource}
    

    或者在代码中

    binding.Mode = BindingMode.OneWayToSource;
    

    【讨论】:

    • 我不认为他的意思是使用 XAML
    • 他可以轻松地在代码中设置绑定。关键是使用Mode = OneWayToSource
    • 尽管如此,您的解决方案并未解析 PropertyPath 以订阅更改。
    • 这是一个有趣的解决方案,但是,当源更改时如何获得通知?似乎使用 OneWayToSource 禁用了有关源更改的任何通知和事件。
    • 我以为你不想调用 getter?现在你知道了吗?
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2010-11-04
    相关资源
    最近更新 更多