2017-10-20 32 views
0

林在WPF新的用戶控件tamplates,並嘗試學習VMMV。我嘗試使用xaml中的模板創建TabControl。 我想要tabitem的網格內容和用戶控件的網格列表。在添加一個用戶控件後,tabitem的標題呈現正確,但沒有內容。哪裏不對?謝謝。電網與TabControl的

這是我的XAML:

<TabControl ItemsSource="{Binding Items}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Visibility="Hidden" Name="tcContent" Grid.Column="1" Grid.Row="0"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
     <TextBlock Text="{Binding Header}" /> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
     <ContentControl Content="{Binding Content}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

視圖模型:

public class Tab 
{ 
    public string Header { get; set; } 
    public ObservableCollection<UserControl> Content { get; set; } 
} 

public class MainWindowsViewModel 
{   
    ObservableCollection<Tab> _items = new ObservableCollection<Tab>(); 

    public ObservableCollection<Tab> Items 
    { 
     get 
     { 
       return _items; 
     } 
    }  
} 

背後填充的tabcontrol代碼:

public MainWindow() 
{ 
    this.DataContext = new MainWindowsViewModel(); 
} 

public void AddToTab(string header, UserControl c) 
{ 
    Tab tab = new Tab(); 
    tab.Header = header; 
    tab.Content = new ObservableCollection<UserControl>(); 
    tab.Content.Add(c); 

    ((MainWindowsViewModel)this.DataContext).Items.Add(tab); 
} 

回答

3

你誤解了MVVM原則。

在您的視圖模型,你有Tab對象的集合,和他們每個人持有的UserControl秒的集合。這樣,您的視圖模型包含一些視圖元素(UserControl s)。在MVVM中,你不應該那樣做。

而是創建的視圖的模型爲每個標籤項目是描述所述表示(因此視圖 - 模型)的模型;在XAML中,描述瞭如何做這些視圖模式應該像使用DataTemplate秒。

不過這一切只需要如果你的意見必須是動態的。例如。你不知道哪些數據可用,因爲你從數據庫中獲取它們。

如果您的TabItem顯示一組不會更改的UserControl,則只需在XAML中完整描述您的視圖,而不需要任何DataTemplate s。

+0

我想我undranstand。用我最低限度的languagne知識:)我需要一個tabitem的視圖模型。一個班級中沒有所有選項卡項目。 – Pimpy

2

首先,除去Visibility="Hidden"形成TabControl。然後改變ControlControlItemsControl,可容納Tab.Content,這是一個集合。但是,你應該注意@ dymanoid的答案中提到的問題。

<TabControl.ContentTemplate> 
    <DataTemplate > 
     <ItemsControl ItemsSource="{Binding Content}" /> 
    </DataTemplate> 
</TabControl.ContentTemplate> 
+0

是的,這是我的其他代碼。此屬性我稍後在代碼中更改。但這不是觀點。 – Pimpy