如果WPF主窗口中有四个内容相同的TabItem(一个View,一个ViewModel),如何告诉View它属于哪个TabItem?

8zzbczxx  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(134)

在探索/学习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>
fdbelqdn

fdbelqdn1#

实现这一点的惯用方法是在视图模型中创建一个可观察的集合,该集合包含所需的每个子视图模型,然后将该集合绑定到TabControlItemsSource属性。这将为集合中的每个元素填充一个选项卡控件。
故事的其余部分很简单,只是模板。你有你的ContentTemplate属性,它定义了孩子应该如何看(你的用户控件)和你的ItemTemplate,它定义了头应该如何看(一个文本块绑定到你孩子的VM中的Name属性)。
另外,不要试图手动更改用户控件的数据上下文,因为框架已经正确处理了它。

相关问题