访问父USerControl ViewModel,反之亦然

时间:2016-10-17 11:22:16

标签: c# wpf xaml mvvm

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

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;
}

1 个答案:

答案 0 :(得分:0)

如果使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可以在实例化时传递给子视图模型。