Itemsource的条件静态资源

时间:2016-02-05 21:25:20

标签: c# wpf mvvm

目前为了修复telerik的错误,我的ItemsSource必须指向我正在使用的viewmodel。

Relationship.xaml

<UserControl.Resources>
     <Client:PersonViewModel x:Key="MyViewModel"/>
</UserControl.Resources>

使用它的地方。

 <Telerik:GridViewComboBoxColumn Header="Relationship" 
                                 ItemsSource="{Binding GridRelationshipTypes, Mode=TwoWay, Source={StaticResource MyViewModel}}" 
                                 DataMemberBinding="{Binding RelationshipType}" 
                                 SelectedValueMemberPath="Id" 
                                 DisplayMemberPath="Name" 
                                 IsReadOnly="False"/>

我有四个其他视图模型需要应用此逻辑。我不想为这么小的东西创建5个不同的UserControl。我想知道我是否可以创建一个方法,以便它将检查当前的viewmodel类型是什么,并将使用相应的viewmodel。

PseudoCode - ViewModelTypes是一个枚举。

public void StaticResourcToUse(ViewModelTypes viewModelType)
{
    if (viewModelType == ViewModelTypes.PersonViewModel)
        use personviewmodel resources
    if (viewModelType == ViewModelTypes.BusinessViewModel)
        use businessViewModel resources
}

1 个答案:

答案 0 :(得分:1)

如果我理解你想要的是基于视图模型切换视图。

使用ContentControl显示数据,并根据更改的属性替换触发器中的ContentTemplate

Here's an example in Rachel Lim's blog根据绑定属性交换模板:

<DataTemplate x:Key="CarTemplate" TargetType="{x:Type local:YourViewModel}">
     <TextBlock Text="I'm a Car" />
</DataTemplate> 

<DataTemplate x:Key="TrackTemplate" TargetType="{x:Type local:YourViewModel}">
     <TextBlock Text="I'm a Track" />
 </DataTemplate>

<DataTemplate DataType="{x:Type local:YourViewModel}">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">
                 <Setter Property="ContentTemplate" Value="{StaticResource CarTemplate}" />
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding YourType}" Value="Track">
                         <Setter Property="ContentTemplate" Value="{StaticResource TrackTemplate}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
 </DataTemplate>