[英]Multiple view models with MahApps.Metro within TabControl
我試圖獲取一個TabControl來顯示來自兩個不同類別/視圖模型的保存數據。 基於這兩個資源, WPF MahApps.Metro Tabcontrol數據綁定了嗎? 和未應用DataTemplates ,我嘗試了以下方法,因為它給出了編譯錯誤,因此並不能很好地進行剪切。
<TabControl ItemsSource="{Binding Collection}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我有相應的類:
public class ViewModel {
public string Title { get; set; }
}
public class SubViewModelAlpha : ViewModel { }
public class SubViewModelBeta : ViewModel { }
// In another class, I have this property ...
public ObservableColletion<ViewModel> Collection {
get { return _collection; }
}
// ... and this list
private ObservableColletion<ViewModel> _collection;
我收到的錯誤是“屬性ContentTemplate設置不止一次”,這是有道理的,但是在設置ContentTemplate內容之前,如何在ViewModel類型上應用相同類型的檢查呢?
我已經嘗試過在ContentTemplate上使用DataType
,但這不起作用。
PS! 當然,我確實希望每個視圖模型中有更多的數據,但是此示例顯示了我要實現的目標。
我認為這里的問題是它自己的內容模板不接受單個模板,就像您為單個窗口添加兩個網格時,它會告訴您content屬性不能設置多次
從基本的角度來看,我可以想到的是,您可以將單個模板組合在一起,並通過觸發器和轉換器在它們之間進行選擇
檢查本文http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector
閱讀更多內容之后,似乎可以使用ContentTemplateSelector來解決問題,盡管我不確定是否存在任何奇怪的依賴關系。
我將xaml更改為:
<TabControl ItemsSource="{Binding Collection}"
ContentTemplateSelector="{DynamicResource MyContentTemplateSelector}">
<TabControl.Resource>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelAlpha}">
<TextBlock>SubViewModelAlpha</TextBlock>
</DataTemplate>
<DataTemplate x:Key="BetaTemplate" DataType="{x:Type viewModels:SubViewModelBeta}">
<TextBlock>SubViewModelBeta</TextBlock>
</DataTemplate>
<viewModels:MyContentTemplateSelector
x:Key="MyContentTemplateSelector"
AlphaTemplate="{StaticResource AlphaTemplate}"
BetaTemplate="{StaticResource BetaTemplate}" />
<TabControl.Resource>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
將以下課程添加到我的項目中:
public class MyContentTemplateSelector : DataTemplateSelector
{
public DataTemplate AlphaTemplate { get; set; }
public DataTemplate BetaTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is SubViewModelAlpha)
return AlphaTemplate;
if (item is SubViewModelBeta)
return BetaTemplate;
return base.SelectTemplate(item, container);
}
}
這段代碼大致基於Using ContentTemplateSelector ,我不確定有什么警告(如果有的話)。
但是,我確實相信可以使用直接使用數據類型的更好解決方案,但是我不知道該怎么做! 然而...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.