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)
应用程序DbContext在MainViewModel.cs构造函数中以这种方式实例化:
_context = new MyEntities();
Run Code Online (Sandbox Code Playgroud)
如何通过?将这个EF传递DbContext给SearchEmployeeViewModel.cs构造函数MainWindow.xaml?我正在尝试做类似的事情,但是传递整个数据上下文对象:在哪里创建参数化的ViewModel?
更新:我正在尝试将EF DbContext传递给用户控件.
您使用此MVVM进行了标记,因此这个答案将基于使用MVVM.
View不应该创建对象或尝试分配值...它只是用户友好地反映用户可以用来与之交互的ViewModel/Models.
你现在看到的是:
这是不正确的,因为View不应该负责创建对象或分配这样的值.
你想要的MVVM是什么
所以你应该拥有的是这样的:
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中正确地执行此操作,但是如果我被迫选择一个,我会选择使用代码.你现在已经打破了一堆规则,为什么不再一个:)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |