簡體   English   中英

TabControl中帶有MahApps.Metro的多視圖模型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM