我创建了一个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。
答案 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中,并使用Visibility
和BooleanToVisibilityConverter
有条件地隐藏/显示它们。鉴于这两个选择,我可能会选择这一个,因为它在代码中更清晰,并且比上面的条件DataTemplate更容易维护。但是,您似乎表明您不想这样做,所以我提出了第一个作为选项。