微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net – Silverlight中的DataTemplate.DataType替代

我有一个属性的视图模型,它是一个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;

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐