2010-09-28 57 views
2

我有一個集合,它擁有所有從同一個接口繼承的多種類型的項目。這綁定到一個ItemsControl。窗口的DataContext被設置爲保存集合的ViewModel。WPF MVVM ItemsControl具有多個ViewModels,具體取決於對象類型

我想要做的是讓集合中不同類型的每個項目使用不同的ViewModel。

因此,如果我的項目控件中的模板是像下面這樣設置的,我希望第一個模板具有ViewModel1的DataContext,第二個模板具有ViewModel2的DataContext。我無法直接在它們上設置DataContext,因爲ItemsControl會將DataContext設置爲該項目。

任何人都知道這個解決方案,或使用MVVM更好的方法嗎?

<DataTemplate DataType="{x:Type Models:ItemType1}"> 
    <Controls:MyControl Text="{Binding Body}"/> 
</DataTemplate> 

<DataTemplate DataType="{x:Type Models:ItemType2}"> 
    <Controls:MyControl2 Text="{Binding Body}"/> 
</DataTemplate> 

回答

5

爲什麼你不公開一個ViewModels的集合?

var viewModels = new ObservableCollection<ViewModelBase>(items.Select(CreateViewModelFromItem)); 


private ViewModelBase CreateViewModelFromItem(Item item) 
{ 
    if (item is ItemType1) return new ViewModel1((ItemType1)item); 
    if (item is ItemType2) return new ViewModel2((ItemType2)item); 
    ... 
    throw new ArgumentException("Unknown model type"); 
} 

,改變你的DataTemplates綁定到的ViewModels,不是物品......

1

也許你可以使用一個ValueConverter,將產生正確的視圖模型

<DataTemplate DataType="{x:Type Models:ItemType1}"> 
    <Controls:MyControl DataContext="{Binding Converter=ViewModelLocator}" Text="{Binding Body}"/> 
</DataTemplate> 

不確定它是否可以工作,但值得一試。

相關問題