0

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

在 Designer.cs(MVVM 中的模型)中,数据库中有两个不同的类: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 列表。

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

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

我希望我的问题足够清楚。

头晕。

4

1 回答 1

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>

然后,在您的视图模型中,创建:

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

并有条件地使用您的任何一个集合加载它。

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

于 2012-05-01T23:44:37.980 回答