我有一个视图模型,它的属性FieldsObservableCollection<FieldVM>。在使用此属性的视图中,我有一个ItemsControl像这样:

...
<ItemsControl ItemsSource="{Binding Fields}" />
...


FieldVM是一个抽象类,由诸如TextFieldVMEnumFieldVM之类的类实现。在运行时,这些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/

10-11 14:38