我找到了一个解决方案,尽管这个解决方案并不真正令人满意。
在XAML中,为每种类型的
KeyValuePair<T,U>
要显示并给它一些唯一的x:key:
<DataTemplate x:Key="DictItemOfStringAndAddressVM">
<!-- ... -->
</DataTemplate>
然后在codebehind中,创建一个datatemplateselector并重写selecttemplate:
public class GenericDataTemplateSelector : System.Windows.Controls.DataTemplateSelector
{
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if ((element != null) && (item != null))
{
if (item is DictItemVM<string, Remote.Address>)
{
return element.FindResource("DictItemOfStringAndAddressVM") as DataTemplate;
}
else if(item is SomeOtherComplexType)
{
// ...
}
else return base.SelectTemplate(item, container);
}
return null;
}
}
在XAML中,再次声明该类为资源:
<mvvm:GenericDataTemplateSelector x:Key="GenDataTempSelect"/>
最后,(在我的例子中)在ContentControl中,添加属性:
ContentTemplateSelector="{StaticResource GenDataTempSelect}"
——
缺点:
-
创建新的数据模板时,必须在两个位置更改代码。
-
每个ContentControl、ListView…必须设置适当的属性。
-
并不能真正回答如何在WPF中引用泛型类型的问题!
优势:
-
易于添加任何结构或复杂性的新类型(享受C相对于WPF的所有好处…)
-
WPF中没有复杂的嵌套类型描述,因为上面的解决方案需要这样做。