2017-10-20 43 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