Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为放置在窗口上的所有UserControl设置相同的DataContext_C#_Wpf_Datacontext - Fatal编程技术网

C# 如何为放置在窗口上的所有UserControl设置相同的DataContext

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

在MainWindowViewModel.cs中。 建造商是:

    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();