[英]WPF: Bind Tab Control
我正在使用MVVM,并且试图绑定TabControl's
ItemsSource
,我使用了以下代码:
<TabControl ItemsSource="{Binding ProjectComponents}"
SelectedIndex="{Binding SelectedMenu, Mode=TwoWay}" Grid.Column="1" Margin="5">
对于视图模型:
projectComponents = new ObservableCollection<TabItem>();
projectComponents.Add(new TabItem()
{
Content = new ProjectComponentsView()
{
DataContext = new ProjectClientHandlerViewModel()
}
});
我在Silverlight
项目中使用了它,并且效果很好,但是在WPF
,我不知道为什么TabItem
的内容不显示是为什么。
编辑:
我将代码编辑为:
视图:
<TabControl ItemsSource="{Binding ProjectComponents}" SelectedIndex="{Binding SelectedMenu, Mode=TwoWay}" Grid.Column="1" Margin="5">
<TabControl.ContentTemplate>
<DataTemplate >
<this:ProjectComponentsView DataContext="{Binding}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
查看模型:
projectComponents = new ObservableCollection<ProjectComponentViewModel>();
projectComponents.Add(new ProductViewsHandlerViewModel());
其中ProjectComponentViewModel
是ProductViewsHandlerViewModel
的基类,但仍无法正常工作。
这是一个快速入门的例子
public class MainVm : VMBase
{
public ObservableCollection<TabVM> Items { get; set; }
public VMBase SelectedItem {get;set;}
public MainVm()
{
Items = new ObservableCollection<TabVM>()
{
new TabVM(){Header="A",Content = new SomeVm()},
new TabVM(){Header="B",Content = new SomeVm()},
new TabVM(){Header="C",Content = new SomeVm()},
new TabVM(){Header="D",Content = new OtherVm()}
};
}
}
public class TabVM : VMBase
{
public string Header { get; set; }
public VMBase Content { get; set; }
}
public class SomeVm : VMBase{}
public class OtherVm : VMBase{}
public class VMBase { }
<TabControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type local:SomeVm}">
<TextBlock>SomeVm Template</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type local:OtherVm}">
<TextBlock>OtherVm Template</TextBlock>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"></TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding Content}"></ContentControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
当我们在资源中进行设置时,模板是根据ViewModel
类型选择的,因此,您还应该使用一个代表TabItem
的ViewModel
,在上面的代码段中,该TabItem
是TabVM
。
在选项卡控件的ItemTemplate
中,设置标题模板;在ContentTemplate
,放置ContentControl
并将其Content
绑定到TabVM
的Content
属性。
并且不要忘记实现INotifyPropertyChanged
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.