我已經搜索了很多SO,並沒有找到我的問題的答案。 我想使用TabControl和MVVM。這裏是我加的TabControl爲MainWindow.xamlWPF與ContentControl的TabControl
<Window.Resources>
<DataTemplate DataType="{x:Type models:PartnersViewModel}">
<views:PartnersView />
</DataTemplate>
<DataTemplate DataType="{x:Type models:ProjectsViewModel}">
<views:ProjectsView />
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<models:ApplicationViewModel/>
</Window.DataContext>
<TabControl ItemsSource="{Binding PageViewModels}" TabStripPlacement="Left">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
PageViewModels是ObservableCollection<IPageViewModel>
。 IPageViewModel
是一個簡單的界面與一個屬性Name
。這個接口有兩個實現PartnersViewModel
和ProjectsViewModel
。
public class ProjectsViewModel : IPageViewModel
{
public String Name
{
get { return "Projects"; }
}
}
public class PartnersViewModel : IPageViewModel
{
public String Name
{
get { return "Partners"; }
}
}
我希望每個選項卡都顯示爲ContentControl。標題文本取自「名稱」屬性。我ProjectsView和PartnersView看起來是這樣的:
<UserControl x:Class="WANIRPartners.Views.ProjectsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" >
<Grid>
<Label Content="Projects Content" />
</Grid>
</UserControl>
在TabControl
使用此代碼,標題和內容是完全一樣的。 「項目內容」/「合作伙伴內容」顯示在選項卡標題中,並且(在標籤內容中也是這樣)。當我將<Label/>
更改爲<DataGrid/>
選項卡標題包含數據網格(原文!)。 我如何才能正常工作。我的意思是,如何根據PageViewModels
中的內容將標題顯示爲屬性Name
的值以及正確呈現<views:PartnersView />
或<views:ProjectsView />
的標籤內容。
我是否正確理解它是通過'DataType'選擇正確的'DataTemplate',但它忽略了'ItemTemplate'的頭部? 'TabControl'是否有默認模板? – dkozl
看來你是對的。 DataTemplate被正確選擇,但ItemTemplate被忽略。 TabControl的默認模板是什麼意思?對不起,我剛剛開始使用WPF。 – sop3k
我的意思是你展示的XAML應該工作,並且在我的結尾工作。我沒有看到任何明顯的錯誤,所以我的問題是你改變了'TabControl'的模板(它看起來如何),你使用的是像MahApps還是它的默認外觀。明確的'ItemTempate'應該優先於隱含的'DataType'模板 – dkozl