访问父用户控制视图模型,反之亦然

本文关键字:模型 反之亦然 视图 控制 用户 访问 | 更新日期: 2023-09-27 18:13:19

假设在ParentView.xaml中有一个名为ParentUserControl的用户控件。在后面的代码我已经设置了ParentViewModel的实例,因为它的DataContext。在ParentUserControl中有一个ChildUserControl。我怎么能访问ParentViewModel aka ParentUserControl的DataContext在childUserControl的查看模型,也在相反的方式我如何访问childviewmodel在parentViewModel。

ParentView.xaml

<UserControl x:Class="Test.ParentView"             
             mc:Ignorable="d"
             Name="ParentUserControl"
             >
    <UserControl.Resources>
        <ControlTemplate x:Key="ChildControlTemplate">
            <control:ChildUSerControl/>
        </ControlTemplate>
    </UserControl.Resources>
    <Grid>
        <Border Grid.Row="0" BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,0">
           <ContentControl Name="ChildControlTemplate"  Width="Auto" ></ContentControl>
        </Border>
    </Grid>
</UserControl>

ParentView.xaml.cs

public ParentView()
{
    ParentViewModel parentViewModel = new ParentViewModel();
    this.DataContext = parentViewModel;
    ChildUSerControl childUserControl = new ChildUserControl();
    InitializeComponent();
    ChildControlTemplate.Content = childUserControl;
}

访问父用户控制视图模型,反之亦然

如果你让ChildViewModel成为ParentViewModel的一个属性(如下面的例子中的ChildVM),你可以在XAML中将它作为ChildUserControl的DataContext连接起来。同时,您可以在XAML中创建ParentViewModel,而无需在后面的代码中进行创建。比如:

 <UserControl x:Class="Test.ParentView"             
                 xmlns:vm="clr-namespace:NamespaceForYourParentViewModel"
                 mc:Ignorable="d"
                 Name="ParentUserControl"
                 >
       <UserControl.DataContext>
          <vm:ParentViewModel />
        </UserControl.DataContext>
        <UserControl.Resources>
            <ControlTemplate x:Key="ChildControlTemplate">
                <control:ChildUSerControl DataContext="{Binding Path=ChildVM}/>
            </ControlTemplate>
        </UserControl.Resources>

然后你的父视图模型和子视图模型可以在c#中以你喜欢的方式通信- ParentViewModel将能够在实例化它时与子视图模型通信。并且ParentViewModel可以在实例化时传递给子视图模型。