2012-05-01 80 views
0

我創建了一個DBML文件,它自動創建的designer.cs示出不同用戶控件 - WPF MVVM

在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> 

到目前爲止一切正常。

我想有一個堆棧面板,其中顯示元素列表或元素B列表取決於條件。

注意:要獲取元素列表的屬性是不同的。 即

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

我希望我的問題很清楚。

Dazy。

回答

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;} 

,並用您的收藏有條件地加載它。

或者,將兩個ItemsControl保留在XAML中,並使用VisibilityBooleanToVisibilityConverter有條件地隱藏/顯示它們。考慮到這兩個選擇,我可能會選擇這一個,因爲它在代碼中更清晰,並且比上面的條件DataTemplate更容易維護。然而,你似乎表示你不想這樣做,所以我提出了第一個選項。

+0

謝謝,選項#1正是我所需要的。它效果很好。 –

+0

@dazy請將此標記爲答案 – blindmeis