现在的位置: 首页 > 综合 > 正文

WPF:自定义XAML标记扩展时使用IProvideValueTarget获取目标对象信息

2012年02月15日 ⁄ 综合 ⁄ 共 891字 ⁄ 字号 评论关闭

自定义标记扩展时,改写MarkupExtension的ProvideValue方法中的唯一一个参数是IServiceProvider类型。这个IServiceProvider是在System命名空间内,并且是.NET 1.0就有的类型,用来返回针对一个对象的服务对象。而针对标记扩展的服务对象也有很多,这里有一个详细的列表:http://msdn.microsoft.com/zh-cn/library/system.windows.markup.markupextension.providevalue.aspx

 

不过最常见的就是IProvideValueTarget类型的服务。该类型有两个属性,分别返回使用该标记扩展的对象和目标属性。

image

 

TargetObject是目标对象。

TargetProperty是目标对象的属性。

比如定义如下自定义标记扩展:

//using System.Windows.Markup;

//using System.Diagnostics;

 

public class TestExtension : MarkupExtension

{

    public override object ProvideValue(IServiceProvider serviceProvider)

    {

        var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));

 

        Debug.WriteLine(target.TargetObject.GetType());

        Debug.WriteLine(target.TargetProperty.GetType());

 

        return "TEST";

    }

}

 

然后用在XAML中:

<Button Content="{loc:Test}"/>

 

调试Log文件内容会是:

System.Windows.Controls.Button

System.Windows.DependencyProperty

抱歉!评论已关闭.