通过XAML将DB上下文传递给用户控件的VM

Ale*_*lex 2 c# wpf xaml entity-framework mvvm

我在MVVM Light WPF应用程序中使用Entity Framework 6.我想将应用程序传递DbContext给用户控件的视图模型MainWindow.xaml.

用户控件的视图模型是SearchEmployeeViewModel.cs并具有以下构造函数:

public SearchEmployeeViewModel(MyEntities context)
{
    Context = context; 

    // Other code...
}       
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml声明使用该用户的控制,这是据我可以在我尝试去:

<usercontrol:SearchEmployeeControl>
    <ObjectDataProvider ObjectType="{x:Type data:MyEntities}">
        <ObjectDataProvider.ConstructorParameters>
            <data:MyEntities >

            </data:MyEntities>
        </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
</usercontrol:SearchEmployeeControl>
Run Code Online (Sandbox Code Playgroud)

应用程序DbContextMainViewModel.cs构造函数中以这种方式实例化:

_context = new MyEntities();
Run Code Online (Sandbox Code Playgroud)

如何通过?将这个EF传递DbContextSearchEmployeeViewModel.cs构造函数MainWindow.xaml?我正在尝试做类似的事情,但是传递整个数据上下文对象:在哪里创建参数化的ViewModel?

更新:我正在尝试将EF DbContext传递给用户控件.

Rac*_*hel 7

您使用此MVVM进行了标记,因此这个答案将基于使用MVVM.

View不应该创建对象或尝试分配值...它只是用户友好地反映用户可以用来与之交互的ViewModel/Models.

你现在看到的是:

  • AppStartup创建EF dbContext,并将其分配给View.DataContext
  • View创建ViewModel,并尝试将其传递给EF dbContext

这是不正确的,因为View不应该负责创建对象或分配这样的值.

你想要的MVVM是什么

  • AppStartup
    • 创建ViewModel和EF dbContext
    • 将dbContext设置为ViewModel
    • 创建视图,并将ViewModel分配给View.DataContext
  • View向用户显示ViewModel并允许它们与之交互

所以你应该拥有的是这样的:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    var app = new MainWindow();
    var dbContext = new MyEntities();
    var context = new MyViewModel(dbContext);

    app.DataContext = context;
    app.Show();
}
Run Code Online (Sandbox Code Playgroud)

AppStartup负责任何类型的应用程序初始化,例如创建EF DataContext或ViewModels.

从View中,您可以编写类似的内容

<DataTemplate DataType="{x:Type local:SearchEmployeeViewModel}">
    <userControl:SearchEmployeeControl />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

这将告诉WPF

只要您SearchEmployeeViewModel在VisualTree中遇到类型对象,就可以使用它来绘制它SearchEmployeeControl,并将DataContext该控件设置为SearchEmployeeViewModel.

通常,ViewModel通过Contentor ItemsSource属性插入UI ,如下所示:

<ContentControl Content="{Binding SearchEmployeeViewModel}" />

<TabControl Content="{Binding TabViewModels}" />
Run Code Online (Sandbox Code Playgroud)

如果你有兴趣了解更多,我的博客上也有一个简单的MVVM示例,或者我强烈建议你阅读这个"DataContext"是什么?如果您是WPF的新手,并且仍然不了解DataContext是什么或它是如何工作的.


也就是说,如果您想让View在您的问题中分配ViewModel的值,那么您的选项要么是

  • 通过视图后面的代码分配属性
  • 更改ViewModel.Context为DependencyProperty,并使用OneWayToSource绑定模式绑定它,这意味着绑定仅通过将值从View传输到ViewModel来工作.

我不推荐其中任何一个,而是宁愿重新设计在MVVM中正确地执行此操作,但是如果我被迫选择一个,我会选择使用代码.你现在已经打破了一堆规则,为什么不再一个:)

  • @Alex我很乐意,但是我的办公室被阻止了,所以它必须是另一天.如果您有任何疑问,请随时给我打电话,或者只是发表评论:) (2认同)
  • @Rachel听起来你需要一个新办公室.<笑容> (2认同)