我正在WPF中使用MVVM模式開發應用程序,並且遇到了可能有點獨特的東西。DataBind到ObservableCollection,僅顯示某個派生類的元素
我有一個抽象類MapEntity
它代表一個實體,可以顯示在我的應用程序的繪圖表面上。其他類如LineEntity
,TextEntity
等,繼承於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,我會詢問是否有任何想法。
謝謝你,這是完美的!你知道,如果它是爲如果ItemControls類型類型,如果不是'DataType'創建一個「空白」的元素,或將WPF看到,只有一個'DataTemplate'定義,而不是打擾「試圖」將其添加到控制? – Cyral 2015-02-07 19:37:55
其實我不知道這一點,但我認爲ItemsControl的顯示(數據類型的完整的命名空間和類名)的虛擬文本時沒有合適的模板被找到。 – Bijan 2015-02-08 03:47:16