如何为窗口上的所有UserControls设置相同的DataContext



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

public MainWindowViewModel(Window window)
{
...
}

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

<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。

最后,我删除了所有UserControls中的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执行操作?谢谢

您不需要任何代码来设置UserControls的DataContext,因为MainWindow的DataContext的值是通过依赖属性值继承自动传递给其所有子元素的。

然而,只有当UserControls没有通过类似的方式设置自己的DataContext时,这才会起作用

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

在他们的XAML或中

this.DataContext = new MyViewModel();

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

最新更新