在探索/学习WPF/MVVM的下一步中,我使用了一个带有一个TabControl和四个TabItem的MainWindow。每个选项卡都有相同的内容,一组四个CheckBox定义在一个View中,因此也定义在一个ViewModel中。正如我从各种构造函数中的各种Debug.WriteLine语句中看到的,一个View被示例化了四次,ViewModel也被示例化了四次。
Four TabItems, same content
到目前为止一切顺利,但每个选项卡的数据应该存储在后端(尚未确定),所以我需要通知View示例,从而通知ViewModel示例它们属于哪个TagItem。以便可以单独存储每个TabItem的选中CheckBox。
我确实尝试使用ObjectDataProvider text向OneView构造函数传递参数,但无法使其工作。有什么建议吗?
``
<Window x:Class="FourTabsOneView.MainWindow"
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"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vws="clr-namespace:FourTabsOneView.Views"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="400">
<TabControl x:Name="tControl">
<TabItem x:Name="One" Header="TabOne" Width="80">
<vws:OneView/>
</TabItem>
<TabItem x:Name="Two" Header="TabTwo" Width="80">
<vws:OneView/>
</TabItem>
<TabItem x:Name="Three" Header="TabThree" Width="80">
<vws:OneView/>
</TabItem>
<TabItem x:Name="Four" Header="TabFour" Width="80">
<vws:OneView/>
</TabItem>
</TabControl>
</Window>
<UserControl x:Class="FourTabsOneView.Views.OneView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vms="clr-namespace:FourTabsOneView.ViewModels"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="400">
<UserControl.DataContext>
<vms:OneViewModel />
</UserControl.DataContext>
<StackPanel Orientation="Vertical">
<CheckBox x:Name="cb01" IsThreeState="False" Height="30"
IsChecked="{Binding CB01}"
Content="CheckBox A" />
<CheckBox x:Name="cb02" IsThreeState="False" Height="30"
IsChecked="{Binding CB02}"
Content="CheckBox B" />
<CheckBox x:Name="cb03" IsThreeState="False" Height="30"
IsChecked="{Binding CB03}"
Content="CheckBox C" />
<CheckBox x:Name="cb04" IsThreeState="False" Height="30"
IsChecked="{Binding CB04}"
Content="CheckBox D" />
</StackPanel>
</UserControl>
1条答案
按热度按时间fdbelqdn1#
实现这一点的惯用方法是在视图模型中创建一个可观察的集合,该集合包含所需的每个子视图模型,然后将该集合绑定到
TabControl
的ItemsSource
属性。这将为集合中的每个元素填充一个选项卡控件。故事的其余部分很简单,只是模板。你有你的
ContentTemplate
属性,它定义了孩子应该如何看(你的用户控件)和你的ItemTemplate
,它定义了头应该如何看(一个文本块绑定到你孩子的VM中的Name
属性)。另外,不要试图手动更改用户控件的数据上下文,因为框架已经正确处理了它。