自定义标记扩展时,改写MarkupExtension的ProvideValue方法中的唯一一个参数是IServiceProvider类型。这个IServiceProvider是在System命名空间内,并且是.NET 1.0就有的类型,用来返回针对一个对象的服务对象。而针对标记扩展的服务对象也有很多,这里有一个详细的列表:http://msdn.microsoft.com/zh-cn/library/system.windows.markup.markupextension.providevalue.aspx
不过最常见的就是IProvideValueTarget类型的服务。该类型有两个属性,分别返回使用该标记扩展的对象和目标属性。
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