C# 如何为放置在窗口上的所有UserControl设置相同的DataContext
在MainWindowViewModel.cs中。 建造商是:C# 如何为放置在窗口上的所有UserControl设置相同的DataContext,c#,wpf,datacontext,C#,Wpf,Datacontext,在MainWindowViewModel.cs中。 建造商是: public MainWindowViewModel(Window window) { ... } 在MainWindow.xaml中,我要包括一些用户控件 <Grid Name="UserControl1"> <local:UserControl1/> </Grid> <Grid Name="UserContro
public MainWindowViewModel(Window window)
{
...
}
在MainWindow.xaml中,我要包括一些用户控件
<Grid Name="UserControl1">
<local:UserControl1/>
</Grid>
<Grid Name="UserControl2">
<local:UserControl2/>
</Grid>
...
然后我还尝试为每个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的DataContext,因为MainWindow的DataContext值会自动传递给它的所有子元素
然而,这只有在UserControls不设置自己的DataContext时才起作用,比如
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
在他们的代码背后。删除所有此类分配。希望每个UserControl将使用与MainWindow相同的DataContext—如果不这样做,您肯定已经在其XAML或代码隐藏中显式设置了UserControl的DataContext。把它去掉就行了。把窗口作为MV类的参数,同时进行数据绑定,这也有点奇怪。这可能会导致很多混乱。。。就像克莱门斯建议的那样。你能不能在用户控件中显式地设置它,比如DataContext={Binding DataContext,RelativeSource={RelativeSource AncestorType=Window}}?我写了mainWindowViewModel=new MainWindowViewModelApplication.Current.MainWindow;在UserControl2中,但未编写此文件。DataContext=mainWindowViewModel;它是否也被视为设置DataContext@ClemensAs说,不要在UserControl的XAML或代码隐藏中设置DataContext。然后UserControl将继承主窗口的DataContext。
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
this.DataContext = new MyViewModel();