显示不同的用户控件 - WPF MVVM

时间:2012-05-01 23:14:42

标签: wpf user-controls triggers datatemplate itemscontrol

我创建了一个dbml文件,它自动创建了designer.cs

在designer.cs(MVVM中的Model)中,数据库中有两个不同的类: ElementA和ElementB。

我有两个用户控件: Element_A_UserControl - 显示ElementA的单个实例 Element_B_UserControl - 显示ElementB的单个实例

还有另一个用户控件有两个堆栈面板。 第一个堆栈面板显示Element_A_UserControl列表 第二个堆栈面板显示Element_B_UserControl列表

这是堆栈面板#1 XAML:

<StackPanel>
    <ItemsControl ItemsSource="{Binding AllElements_A}">
         <ItemsControl.ItemTemplate>
                <DataTemplate>
                     <vw:Element_A_UserControl x:Name="elementA">                            
                     </vw:Element_A_UserControl>
                 </DataTemplate>
          </ItemsControl.ItemTemplate>
     </ItemsControl>
</StackPanel>

这是堆栈面板#2 XAML:

<StackPanel>
    <ItemsControl ItemsSource="{Binding AllElements_B}">
         <ItemsControl.ItemTemplate>
                <DataTemplate>
                     <vw:Element_B_UserControl x:Name="elementB">                            
                     </vw:Element_B_UserControl>
                 </DataTemplate>
          </ItemsControl.ItemTemplate>
     </ItemsControl>
</StackPanel>

到目前为止一切正常。

我想要一个堆栈面板,它会根据条件显示ElementA列表或ElementB列表。

注意:获取元素列表的属性是不同的。 即。

ItemsSource="{Binding AllElements_A}
ItemsSource="{Binding AllElements_B}

我希望我的问题足够明确。

Dazy。

1 个答案:

答案 0 :(得分:1)

一种方法是您可以尝试使用条件DataTemplate。像这样:

<ItemsControl.Resources>
    <DataTemplate DataType="{x:Type local:ElementAType}">
         <vw:Element_A_UserControl x:Name="elementA">                            
         </vw:Element_A_UserControl>
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:ElementBType}">
         <vw:Element_B_UserControl x:Name="elementB">                            
         </vw:Element_B_UserControl>
    </DataTemplate>
</ItemsControl.Resources>

然后,在您的viewmodel中,创建:

public ObservableCollection<object> CombinedCollection {get; set;}

并有条件地将其加载到您的任一个集合中。

或者,将两个ItemsControl保留在XAML中,并使用VisibilityBooleanToVisibilityConverter有条件地隐藏/显示它们。鉴于这两个选择,我可能会选择这一个,因为它在代码中更清晰,并且比上面的条件DataTemplate更容易维护。但是,您似乎表明您不想这样做,所以我提出了第一个作为选项。