gpt4 book ai didi

c# - 通过 XAML 将数据库上下文传递给用户控件的 VM

转载 作者:行者123 更新时间:2023-11-30 19:55:41 24 4
gpt4 key购买 nike

我在 MVVM Light WPF 应用程序中使用 Entity Framework 6。我想将应用程序的 DbContextMainWindow.xaml 传递到用户控件的 View 模型。

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

public SearchEmployeeViewModel(MyEntities context)
{
Context = context;

// Other code...
}

MainWindow.xaml 使用它声明用户控件,这是我尝试的最大程度:

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

</data:MyEntities>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</usercontrol:SearchEmployeeControl>

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

_context = new MyEntities();

如何通过 MainWindow.xaml 将此 EF DbContext 传递到 SearchEmployeeViewModel.cs 构造函数中?我正在尝试做类似的事情,但传递整个数据上下文对象:Where to create parametrized ViewModel?

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

最佳答案

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

View 不应该创建对象或尝试分配值...它只是为了用户可以用来与之交互的 ViewModel/Models 的用户友好反射(reflect)。

你现在拥有的似乎是:

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

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

你想要的 MVVM 是

  • 应用启动
    • 创建 ViewModel 和 EF dbContext
    • 将 dbContext 设置为 ViewModel
    • 创建 View ,并将 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();
}

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

从 View 中,您可以编写如下内容

<DataTemplate DataType="{x:Type local:SearchEmployeeViewModel}">
<userControl:SearchEmployeeControl />
</DataTemplate>

这将告诉 WPF

Anytime you encounter an object of type SearchEmployeeViewModel in the VisualTree, draw it using SearchEmployeeControl, and set the DataContext of that control to SearchEmployeeViewModel.

通常,ViewModels 通过 ContentItemsSource 属性插入到 UI 中,如下所示:

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

<TabControl Content="{Binding TabViewModels}" />

我还有一个 Simple MVVM Example on my blog如果您有兴趣了解更多信息,或者我强烈建议您阅读 What is this "DataContext" you speak of?如果您是 WPF 的新手,并且对 DataContext 是什么或它的工作原理还没有深入的了解。


就是说,如果您想让 View 像您在问题中那样分配 ViewModel 的值,您的选择是

  • 通过 View 背后的代码分配属性
  • ViewModel.Context 更改为 DependencyProperty,并使用 OneWayToSource 绑定(bind)模式对其进行绑定(bind),这意味着绑定(bind)只能通过将值从 View 传输到 ViewModel 来实现。

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

关于c# - 通过 XAML 将数据库上下文传递给用户控件的 VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36334531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com