如何为 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();
在他们的代码后面。删除所有此类分配。
在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();
在他们的代码后面。删除所有此类分配。