gpt4 book ai didi

wpf - 如何为多个 View 重用 Entity Framework 数据源 WPF EF MVVM

转载 作者:行者123 更新时间:2023-12-01 11:57:41 25 4
gpt4 key购买 nike

您好,我正在使用 WPF4、EF 和 MVVM 设计一个应用程序。我希望能够创建可在应用程序的多个窗口中使用的可重复使用的 UserControl,并让它们从同一来源提取数据。

假设我有一个 GraphView 组件和一个 TableView 组件,它们可以出现在同一页面上或应用程序的不同位置,我希望它们都反射(reflect)相同的已过滤 EF 实体集合。 MVVM 的常见做法似乎要求每个 View 都有自己的 View 模型。但是我是否应该使用联合 View 模型并将两者绑定(bind)到它,所以如果您更改数据或过滤器,两者会同时更新吗?如果不是,我该如何处理?

感谢您的任何建议!

最佳答案

一种方法可能是拥有两个 ViewModel,每个 View/UserControl 一个,然后将它们嵌套到某个顶层或更高级别的 ViewModel 中。例如,如果两个 View 都位于主窗口 View 中,则它可能如下所示:

public class MainWindowViewModel
{
public MainWindowViewModel(IRepository repository)
{
SharedUserControlData sharedData = new SharedUserControlData()
{
MyCollection = new ObservableCollection<MyEntity>(
repository.GetMyEntities()),
// instantiate other shared data properties
}

UserControl1ViewModel = new UserControl1ViewModel(sharedData);
UserControl2ViewModel = new UserControl2ViewModel(sharedData);
}

public UserControl1ViewModel UserControl1ViewModel { get; private set; }
public UserControl2ViewModel UserControl2ViewModel { get; private set; }

// more stuff...
}

您有一个 SharedUserControlData 类,其中包含两个 View 都可以绑定(bind)到的属性:

public class SharedUserControlData : INotifyPropertyChanged
{
public ObservableCollection<MyEntity> MyCollection { get; set; }
// other properties
// INotifyPropertyChanged implementation
}

然后 UserControls 的 ViewModels 得到那些注入(inject)的数据:

public class UserControl1ViewModel
{
public UserControl1ViewModel(SharedUserControlData data)
{
SharedUserControlData = data;
}

public SharedUserControlData SharedUserControlData { get; private set; }

// more stuff
}

// and the same for UserControl2ViewModel

您的 UserControl View 通过 DataTemplate 绑定(bind)到 ViewModels:

<DataTemplate DataType="{x:Type vm:UserControl1ViewModel}" >
<v:UserControl1View />
</DataTemplate>

// and the same for UserControl2ViewModel

然后 UserControls 内的一些控件绑定(bind)到 SharedUserControlData.MyCollection 和 UserControlViewModels 的其他属性。 MainWindow 的 DataContext 是 MainWindowViewModel:

IRepository repository = new MyRepository(); // or use Dependency Injection
MainWindow window = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel(repository);
window.DataContext = viewModel;

在 MainWindow 的 XAML 中,我们将 UserControls 绑定(bind)到 MainWindow 的 DataContext(即 MainWindowViewModel)的嵌套 ViewModel:

<StackPanel>
<v:UserControl1View DataContext="{Binding UserControl1ViewModel}" />
<v:UserControl2View DataContext="{Binding UserControl2ViewModel}" />
</StackPanel>

这样,两个 UserControl 将具有不同的 ViewModel,但它们共享相同的 SharedData 实例,该实例来自包含两个 UserControl 的 ViewModel 的更高级别的 ViewModel。然后存储库可以访问 EF 数据上下文。 (这里有存储库只是一个例子,你也可以注入(inject)服务类的实例或其他东西。)

关于wpf - 如何为多个 View 重用 Entity Framework 数据源 WPF EF MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359730/

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