如何为放置在窗口上的所有UserControl设置相同的DataContext

时间:2018-07-25 09:17:16

标签: c# wpf datacontext

在MainWindowViewModel.cs中。 构造函数是:

    public MainWindowViewModel(Window window)
    {
       ...
    }

在MainWindow.xaml中,我包含一些UserControl。

   <Grid Name="UserControl1">
        <local:UserControl1/>
    </Grid>

   <Grid Name="UserControl2">
        <local:UserControl2/>
    </Grid>

    ...

我试图为MainWindow设置DataContext,希望每个UserControl将使用与MainWindow相同的DataContext,但是结果却不符合我的预期。

    private void MainWindowLoaded(object sender, RoutedEventArgs e)
    {
        mainWindowViewModel = new MainWindowViewModel(this);
        this.DataContext = mainWindowViewModel;
    }

然后,我还尝试为每个UserControl设置相同的DataContext,但是结果也是错误的,似乎只有一个UserControl可以通过这种方式拥有正确的DataContext。

最后,我删除了所有UserControl中的DataContext设置,但在MainWindow中进行了设置:

   <Grid Name="UserControl1">
    <local:UserControl1 Loaded="UserControl1_Loaded"/>
  </Grid>

  <Grid Name="UserControl2">
    <local:UserControl2 Loaded="UserControl2_Loaded"/>
  </Grid>

...

    private void UserControl1_Loaded(object sender, RoutedEventArgs e)
    {
        mainWindowViewModel = new MainWindowViewModel(this);
        this.DataContext = mainWindowViewModel;
    }

    private void UserControl2_Loaded(object sender, RoutedEventArgs e)
    {
        mainWindowViewModel = new MainWindowViewModel(this);
        this.DataContext = mainWindowViewModel;
    }

结果很好。但是我认为设置DataContext的方法可能不是一个好方法。有没有更好的方法只设置一次DataContext并且可以对所有UserControl起作用?谢谢。

1 个答案:

答案 0 :(得分:1)

您不需要任何代码即可设置UserControls的DataContext,因为MainWindow的DataContext的值会由dependency property value inheritance自动传递给其所有子元素。

但是,这仅在UserControl并未设置自己的DataContext时起作用,例如

<UserControl.DataContext>
    <local:MyViewModel/>
</UserControl.DataContext>

在其XAML中,或

this.DataContext = new MyViewModel();

在其代码后面。删除所有此类任务。