C# 访问;“当前类别”;来自WPF自定义标记扩展
我正试图编写一个定制的C# 访问;“当前类别”;来自WPF自定义标记扩展,c#,wpf,user-controls,markup-extensions,C#,Wpf,User Controls,Markup Extensions,我正试图编写一个定制的MarkupExtension,通过提供更好的方式在XAML中指定绑定,使我的生活更轻松。但是,我想知道是否有任何方法可以访问表示使用MarkupExtension的文件的对象 换句话说,假设我有一个UserControl,它定义了程序数据模型的特定格式副本。这个控件有很多可视化的东西,比如网格、边框和总体布局。如果我对这个UserControl中某个元素的特定属性使用MarkupExtension,我想访问UserControl的实例,而不知道它是什么类型(我计划使用反射
MarkupExtension
,通过提供更好的方式在XAML中指定绑定,使我的生活更轻松。但是,我想知道是否有任何方法可以访问表示使用MarkupExtension
的文件的对象
换句话说,假设我有一个UserControl
,它定义了程序数据模型的特定格式副本。这个控件有很多可视化的东西,比如网格、边框和总体布局。如果我对这个UserControl
中某个元素的特定属性使用MarkupExtension
,我想访问UserControl
的实例,而不知道它是什么类型(我计划使用反射)
这可能吗?在.NET4.0中,他们添加了该功能,但不幸的是,在以前的版本中不可能。如果您使用的是.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
}
我正在使用.NET4!让我试试看。:)我们别无选择,困在3.5里((((((((((在.NET 3.5中,您只能访问IXamlTypeResolver和IProvideValueTarget。不幸的是,它们无法获取您正在处理的xaml文件根目录下的对象。IProvideValueTarget将允许您获取扩展名所调用的对象。我想您可以沿着其可视化树找到根对象,如果您假定root是一个用户控件或窗口。这显然不如.NET4解决方案那么健壮,但它可能在您的场景中工作。