我有一个视图模型,它的属性Fields
是ObservableCollection<FieldVM>
。在使用此属性的视图中,我有一个ItemsControl
像这样:
...
<ItemsControl ItemsSource="{Binding Fields}" />
...
FieldVM
是一个抽象类,由诸如TextFieldVM
和EnumFieldVM
之类的类实现。在运行时,这些FieldVM
实现会添加到Fields
属性中,我希望它们与相关的视图一起显示在我的视图中。在WPF中,这样做很简单,我一直都这样做。您只需在适当的资源字典中执行此操作,即可按预期工作:
<DataTemplate DataType="{x:Type vm:TextFieldVM}">
<v:TextFieldView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:EnumFieldVM}">
<v:EnumFieldView />
</DataTemplate>
现在,我第一次在Silverlight中工作,我希望可以做同样的事情,但是
DataTemplate
没有DataType
属性。我很沮丧Silverlight这样做的方式是什么? 最佳答案
使用值转换器将类型绑定到每个视图的可见性:
<DataTemplate>
<Grid>
<v:EnumFieldView
Visibilty="{Binding Converter={StaticResource ViewVisibilityConverter}, ConverterParameter=Enum}" />
<v:TextFieldView
Visibilty="{Binding Converter={StaticResource ViewVisibilityConverter}, ConverterParameter=Text}" />
</Grid
</DataTemplate>
然后在ViewVisibilityConverter的ConvertTo中,根据类型切换可见性。
另一种查看方式是使用不同类型的值转换器从Application.Resources返回不同的数据模板。
<ListBox ItemTemplate="{Binding Converter={StaticResource ItemTemplateFactory}"/>
在ItemTemplateFactory.Convert()中:
var fieldVM = value as FieldVM;
switch fieldVM.FieldType:
{
case "Text":
return Application.Current.Resources["TextTemplate"] as DataTemplate;
case "Enum":
return Application.Current.Resources["EnumTemplate"] as DataTemplate;
}
关于.net - Silverlight中的DataTemplate.DataType替代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2400522/