XAML中的DataTemplate可以与嵌套类相关联吗?
我正在研究MVVM应用程序,我遇到了数据模板问题。我有一个视图模型,为项目控件提供其他视图模型的集合。这些项是在外部视图模型中定义为嵌套类的层次结构的一部分。到目前为止,我还无法在XAML中创建一个映射来引用内部嵌套类。
这是类层次结构(为简洁起见而简化):
public class MainViewModel
{
public class A
{
}
public class B : A
{
}
public class C : A
{
}
public ObservableCollection<A> Items
{
get;
set;
}
}
在XAML中,我正在尝试将DataTemplate映射到B和C类型,但我无法完全限定嵌套类名。
<ItemsControl ItemsSource="{Binding Path=Items}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type ns:BracingViewModel.B}">
<Grid>
....
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type ns:BracingViewModel.C}">
<Grid>
....
</Grid>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
问题:对嵌套类的引用在XAML中显示为构建错误。我得到以下内容:
Error 5 Cannot find the type 'ns:B'. Note that type names are case sensitive. Line...
Error 5 Cannot find the type 'ns:C'. Note that type names are case sensitive. Line...
如果我将A,B,C类层次结构移动到MainViewModel类之外(即命名空间级别),这样可以正常工作。
作为一般习惯,我尝试将与视图模型相关的类保持为定义为嵌套类,但这导致我遇到这个问题。
所以,我的问题是:甚至可以将DataTemplate与嵌套类相关联吗?如果是这样,那么在XAML部分中如何完成?
提前致谢... 乔
答案 0 :(得分:22)
这对我有用:
<ItemsControl ItemsSource="{Binding Path=Items}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type ns:MainViewModel+B}">
<Grid Background="Blue"
Width="30"
Height="30">
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type ns:MainViewModel+C}">
<Grid Background="Chartreuse" Width="30" Height="30">
</Grid>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
换句话说,只需将.
更改为+
标记扩展程序中的x:Type
信用到:this thread