我有一个简单的IMarkupExtension如下:
public class HelloWorldMarkup : IMarkupExtension<string>
{
public string ProvideValue(IServiceProvider serviceProvider)
{
return "Hello World";
}
public override string ToString()
{
return "DesignTime Hello World";
}
}
和我的Xaml一样使用它..
<StackPanel>
<TextBlock Text="{my:HelloWorldMarkup}" />
<HyperlinkButton Content="{my:HelloWorldMarkup}" />
</StackPanel>
在运行时,它都按预期工作。
然而,在设计时,超链接的内容显示了设计时间值(来自ToString),但TextBlock的文本没有显示。
如果我这样离开,我的设计师会对我抱怨好几天。有没有人对如何在TextBlock Text中显示我的Markups显示设计时间数据有任何建议?
非常感谢,
答案 0 :(得分:5)
尝试..
<TextBlock DataContext="{my:HelloWorldMarkup}" Text="{Binding}" />
答案 1 :(得分:1)
你正走在正确的轨道上。对此(“设计”)问题有一些很好的解决方法:
使用接口IMarkupExtension并从具有内容属性的某些控件派生(例如,ContentControl)。 现在听取对“Parent”属性的更改(您可能必须使用附加属性的一些棘手的解决方法)。然后,事件回调应该使用自定义的简单IProvideValueTarget实现自己调用ProvideValue。然后必须将ProvideValue的结果分配给“Content”属性。这不会影响运行时,因为ProvideValue将在控件之前进行评估,并且在设计时就像魅力一样。
我也在考虑在target属性上安装Binding,从而将基类减少为FrameworkElement。
有关此过程的示例,请参阅https://github.com/MrCircuit/XAMLMarkupExtensions和https://github.com/MrCircuit/WPFLocalizationExtension。