指定DataTemplate.DataType我有这个标记扩展一个自定义类型的扩展名
public class NullableExtension : TypeExtension
{
public NullableExtension() {
}
public NullableExtension(string type)
: base(type) {
}
public NullableExtension(Type type)
: base(type) {
}
public override object ProvideValue(IServiceProvider serviceProvider) {
Type basis = (Type)base.ProvideValue(serviceProvider);
return typeof(Nullable<>).MakeGenericType(basis);
}
}
,其目的是提供一些其他类型的可空版本。它在“普通”XAML中使用时可以按预期工作。例如,如在
<SomeControl DataContext="{My:Nullable System:Int32}"/>
(假设我是类似地对于系统为C#命名空间保持所述扩展中定义的XML命名空间,和)。按照我的预期,控件的数据上下文被设置为System.Type
,Nullable<int>
。
然而,当我使用这个扩展,试图设置的DataTemplate
像
<DataTemplate DataType="{My:Nullable System:Int32}">
<TextBlock ... />
</DataTemplate>
有人告诉我,由编译器的DataType
属性,即
的字典中的密钥无法是类型 'System.Windows.Controls.Primitives.TextBlock'。只有字符串, TypeExtension和StaticExtension的支持。 “
和
” 无构造函数型 'NullableExtension' 有1个参数。
是否有人知道为什么只有这三种方法(甚至没有像我的TypeExtension
的子类)被允许?在这一点上处理XAML的特别之处是什么?是否有另一种方法来实现这一点(基于可能为空的类型的数据模板选择),而不诉诸于DataTemplateSelector
?
谢谢。我意识到这可能是危险的,但我认为可以验证分配给DataType的值的类型实际上是System.Type。我没有试图给DataType赋任何任意值,只是一个Type。 有趣的BAML分析器。 至于拳击问题,这是一个很好的观点,虽然在我得到的情况下,我会明确提供一个Nullable而不是一个盒装值,并且有其他脚手架以使“做正确的事情”我的需求。 看起来我必须继续解决方法。谢谢您的帮助。 –
2009-12-16 05:53:11
呃,我总是忘记注释不要在这里保留额外的换行符。对不起,上面的格式很糟糕。 – 2009-12-16 05:53:45
自写入以来,事情发生了明显变化,并且它看起来像'DataType =“{x:Type TypeName = System:Nullable \'1 [[System.Int32]]}''应该可以在2013年8月工作。 NET 4.0,它没有。我发现解决这个问题的唯一方法就是使用某种MarkupExtension。 – Dan 2013-08-01 20:38:51