如何为 window 上的所有 UserControl 设置相同的 DataContext

how to set a same DataContext for all UserControls put on a window

在MainWindowViewModel.cs。 构造函数是:

    public MainWindowViewModel(Window window)
    {
       ...
    }

在 MainWindow.xaml 中,我要包含一些用户控件。

   <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 并可以作用于所有 UserControls?谢谢。

您不需要任何代码来设置您的用户控件的 DataContext,因为 MainWindow 的 DataContext 的值由 [=12 自动传递给它的所有子元素=].

然而,这只有在 UserControls 没有设置自己的 DataContext 时才有效,例如

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

在他们的 XAML 或

this.DataContext = new MyViewModel();

在他们的代码后面。删除所有此类分配。