2015-02-07 37 views
1

我正在WPF中使用MVVM模式開發應用程序,並且遇到了可能有點獨特的東西。DataBind到ObservableCollection,僅顯示某個派生類的元素

我有一個抽象類MapEntity它代表一個實體,可以顯示在我的應用程序的繪圖表面上。其他類如LineEntityTextEntity等,繼承於MapEntity

要顯示這些,我爲每個類型創建一個ObservableCollection並將其綁定到我的XAML,該XAML接受每個實體的屬性並顯示它們。 (例如,創建一個文本框,其顏色和文字爲TextEntity

一起管理這些實體感覺有點像黑客。如果每個實體都有一堆收藏,我可以創建一個ObservableCollection<MapEntity>,並將所有實體添加到它。這將使得處理它們更容易,比如在用戶拖動實體時檢查其邊界,或者通過在MapEntity中定義的更新方法更新它們。標準繼承的東西。

使用這種技術時,問題就來了,有一個方法來創建綁定到該單個集合(而不是每個ItemsControl綁定到的TextEntity集合,LineEntity等具有)一ItemsControl,但只顯示的元素某種類型?

例如:

視圖模型:

public ObvervableCollection<MapEntity> Entities { get; set; //OnPropertyChanged stuff} 
... 
Entities.Add(new LineEntity(...)); 
Entities.Add(new TextEntity(...)); 

所以,我加入不同MapEntities到一個單一的集合,而不是多個每種類型。

查看:

使用單獨的收藏,我能項目中的每一ItemsControl綁定到特定的集合,而是用Entities收藏,我無法找到特定類型的「過濾」單元得出的一種方式從MapEntity

所以不是這樣做的:

<ItemsControl ItemsSource="{Binding LineEntities}"> <!-- More Stuff --> </ItemsControl> 
<ItemsControl ItemsSource="{Binding TextEntities}"> <!-- More Stuff --> </ItemsControl> 

我想做的事:

<ItemsControl ItemsSource="{Binding Entities WHERE type = LineEntity}"> <!-- More Stuff --> </ItemsControl> 
<ItemsControl ItemsSource="{Binding Entities WHERE type = TextEntity}"> <!-- More Stuff --> </ItemsControl> 

(顯然不是有效的),但基本上我想從集合只類型「過濾器」指出,是需要的,通過沒有單獨的集合,使ViewModel更易於管理。 (並且因此必須分別在每一個上運行操作)

我確信這是不可能的,但想通過XAML或ViewModel,我會詢問是否有任何想法。

回答

2

正如您可能已經知道ItemsControl根據每個項目的類型自動選擇正確的ItemTemplate

爲每個從MapEntity派生的類型(如下所示)定義一個空的DataTemplate,以便任何ItemsControl(未顯式設置其ItemTemplate)從這些資源中進行選擇。

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:TextEntity}"> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:LineEntity}"> 
    </DataTemplate> 
</Window.Resources> 

現在您需要爲每個ItemsControl重寫其中一個。

<ItemsControl ItemsSource="{Binding Entities}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type vm:TextEntity}"> 
      <!-- Template for text entity --> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 
+0

謝謝你,這是完美的!你知道,如果它是爲如果ItemControls類型類型,如果不是'DataType'創建一個「空白」的元素,或將WPF看到,只有一個'DataTemplate'定義,而不是打擾「試圖」將其添加到控制? – Cyral 2015-02-07 19:37:55

+0

其實我不知道這一點,但我認爲ItemsControl的顯示(數據類型的完整的命名空間和類名)的虛擬文本時沒有合適的模板被找到。 – Bijan 2015-02-08 03:47:16

2

您可以看看CollectionViewSource類,並使用它的過濾功能來過濾類型。

好的是,它從您的基礎ObservableCollection傳播集合更改事件。

相關問題