【问题标题】:Accessing "current class" from WPF custom MarkupExtension从 WPF 自定义 MarkupExtension 访问“当前类”
【发布时间】:2011-03-04 02:39:53
【问题描述】:

我正在尝试编写一个自定义的MarkupExtension,通过为我提供一种在 XAML 中指定绑定的更好方法来让我的生活更轻松。但是我想知道是否有任何方法可以访问表示使用MarkupExtension 的文件的对象。

换句话说,假设我有一个UserControl,它定义了我的程序的数据模型的特定再现。这个控件有很多视觉的东西,比如网格、边框和总体布局。如果我在这个UserControl 中某个元素的特定属性上使用我的MarkupExtension,我想访问UserControl 的实例,而不知道它是什么类型(我打算使用反射)。

这可能吗?

【问题讨论】:

    标签: c# wpf user-controls markup-extensions


    【解决方案1】:

    在 .NET 4.0 中,他们添加了 IRootObjectProvider 功能,但不幸的是,这在以前的版本中是不可能的。如果您使用的是 .NET 4.0,则可以执行以下操作:

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        var root = rootObjectProvider.RootObject;
        // do whatever you need to do here
    }
    

    【讨论】:

    • 使用.NET 4!让我试试看。 :)
    • 我们没有其他办法,卡在 3.5 中?! :(((((((((()))
    • 在 .NET 3.5 中,您只能访问 IXamlTypeResolver 和 IProvideValueTarget。不幸的是,他们不会在您正在使用的 xaml 文件的根目录中获取对象。IProvideValueTarget 将允许您获取调用扩展的对象。如果您假设根是 UserControl 或 Window,我想您可以沿着它的可视化树到达根对象。这显然不如 .NET 4 解决方案强大,但它可能适用于您的场景。
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2017-01-09
    • 2011-01-06
    • 2021-02-24
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多