Jos*_*osh 9 wpf xaml datatemplate
我有这个扩展标记
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
它旨在提供其他类型的可空版本.当在"普通"XAML中使用时,它按预期工作.例如,如
<SomeControl DataContext="{My:Nullable System:Int32}"/>
Run Code Online (Sandbox Code Playgroud)
(假设My是为保存扩展的C#名称空间定义的XML名称空间,对于System来说类似).控件的数据上下文设置为System.Typefor,Nullable<int>如我所料.
但是,当我使用此扩展来尝试设置类似的DataType属性时DataTemplate
<DataTemplate DataType="{My:Nullable System:Int32}">
<TextBlock ... />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
编译器告诉我的是
字典的键不能是'System.Windows.Controls.Primitives.TextBlock'类型.只支持String,TypeExtension和StaticExtension."
和
"类型'NullableExtension'的构造函数没有1个参数.
有人知道为什么只允许这三种方法(甚至不是TypeExtension像我的子类一样)?那时处理XAML有什么特别之处?是否有另一种方法来实现这一点(基于可以为空的类型的数据模板选择)而不诉诸DataTemplateSelector?
Anv*_*aka 12
我真的遇到了你的问题,这就是我找到的.
问:为什么只有这三个(
String,TypeExtension,和StaticExtension)被允许?
答:按设计.如果您可以编写任何自定义标记扩展以用作字典中的键,那么会引入哪些副作用?考虑你有Binding作为DataType的值...我很确定你可以添加与字典键动态性质相关的十几个问题.
问:那时XAML的处理有什么特别之处?
一.那时你有BAML创建.问题来自内部类BamlRecordWriter,但消息并未描述实际问题.当您将自定义标记扩展指定为DataType时,它将获取DataTemplate的子项,并检查它是否可以从string,TypeExtension或StaticExtension分配(请参阅BamlRecordWriter.WriteElementStart()函数).确实.不是您的扩展(可分配给TypeExtension),而是第一个子(不可分配).现在你有这种奇怪的" 不能成型 "的东西.虽然它看起来像是BamlRecordWriter的错误,但我认为他们故意留下了它.直到它不允许您使用自定义标记扩展作为DataType值,谁在乎错误消息?
问:有没有其他方法可以实现这一点(基于可以为空的类型的数据模板选择)而无需借助DataTemplateSelector?
答:是的,有点儿.首先,你可以让标准的TypeExtension为你做所有脏工作:
<DataTemplate DataType="{x:Type TypeName=System:Nullable`1[[System.Int32]]}">
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
但在大多数情况下(如果不是所有的话)你都不会看到模板结果.为什么?现在谈到可以为空的类型的装箱规则.装箱非空可空值类型框表示值类型本身,而不是包装值类型的System.Nullable.因此,默认模板选择器将查找DataType为Tnot的DataTemplate Nullable<T>.
我可能无法理解您尝试使用可空扩展解决的确切问题,但您可能希望将nullables包装到您自己的ref类型中,为包装器编写一个DataTemplate并使用DataTemplate.Triggers,以选择内容外观.好吧,这看起来像重新发明的数据模板选择器:)...
注意:我不是MS人,我的调查结果是基于Reflector和我自己的经验(这并不像我想要的那样大而是替代文字http://www.kolobok.us/smiles/standart/ blush2.gif).无论如何,希望我能帮助:).
干杯