在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起作用?谢谢。
答案 0 :(得分:1)
您不需要任何代码即可设置UserControls的DataContext,因为MainWindow的DataContext的值会由dependency property value inheritance自动传递给其所有子元素。
但是,这仅在UserControl并未设置自己的DataContext时起作用,例如
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
在其XAML中,或
this.DataContext = new MyViewModel();
在其代码后面。删除所有此类任务。