c# - 使用 EF Core 重用 MVVM 模式中的 View

标签 c# wpf mvvm entity-framework-core

我正在使用 EF Core 和 MVVM 模式,但我不确定如何继续创建“可重用” View 。
我有一个带有常用操作(CRUD 和过滤)和 DataGrid 的菜单条的 View 。这将通过 EF Core 填充。我有一堆不同的模型(所有这些模型都继承了一个简单的基本模型类,只有一个 int ID 属性),我需要显示我的数据。
现在,根据 DRY 的说法,由于 View 实际上是相同的,我不应该为每个模型创建不同的 View ,只需创建一个通用 View 并相应地填充它。另外,我在这里读到 View 模型通常不可重复使用,因此我需要为每个模型创建一个 View 模型。这是我的问题。
在创建 View 时,我被教导了这种模式:

public class StockView : Window
{
    private StockViewModel _viewModel;

    public StockView(StockViewModel viewModel)
    {
        InitializeComponent();
        _viewModel = viewModel ?? new StockViewModel();
        DataContext = _viewModel;
    }
}
但是,这意味着该 View 将只接受 StockViewModel ,所以我将无法重用它。我尝试为所有要继承的 View 模型创建一个抽象 View 模型基础,并将我的通用 View 创建为
public class GenericView : Window
{
    private ViewModelBase _viewModel;

    public GenericView(ViewModelBase viewModel)
    {
        InitializeComponent();
        _viewModel = viewModel ?? new ViewModelBase();
        DataContext = _viewModel;
    }
}
但是现在,我将无法访问任何可以异步获取数据的 viewmodel 方法。不允许使用异步抽象方法,我尝试创建一个方法,该方法将返回我的数据的服务类,但我也不能使用它:
public class StockService
{
    private MyDbContext _context = new MyDbContextFactory().CreateContext();
    
    public async Task<List<Stock>>GetStocksAsync()
    {
        return await _context.STOCKs.Select(x=>x).ToListAsync();
    }
}
public abstract class ViewModelBase
{
    public abstract List<EntityBase> GetAllData();
}
public class StockViewModel : ViewModelBase
{
    public override List<EntityBase> GetAll()
    {
        var stockServ= new StockService();
        return stockServ.GetStocksAsync().Result; //<==== this doesn't compile as the method expect List<EntityBase> but it returns List<Stock>
    }
}
那么,我如何能够为不同的 View 模型重用 View 呢?

最佳答案

Async abstract methods aren't allowed ...


不,但是 async是一个实现细节。抽象类或接口(interface)仍然可以定义返回 Task<T> 的方法。然后您可以异步实现:
public abstract class BaseViewModel<T>
{
    public abstract Task<IEnumerable<T>> GetItems();
}

public class StockViewModel : BaseViewModel<Stock>
{
    public override async Task<IEnumerable<Stock>> GetItems()
    {
        await ...
        return ...
    }
}

关于c# - 使用 EF Core 重用 MVVM 模式中的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64610145/

相关文章:

javascript - 使用 C# 从 SQL 数据库动态更改图表数据

c# - 如何在解决方案中获取给定类的完整命名空间的程序集名称和类名称?

design-patterns - MVP 与 MVVM - 为什么?

c# - 具有依赖属性的 ContentPresenter 和 Datatemplates

c# - 使用 MVVM 在 TreeView 中显示实体

c# - 在 x64 模式下运行时可以生成 x86 哈希值吗?

c# - 在除一个环境之外的所有环境中进行日志记录 - log4net

c# - 使用 Xamarin.Forms 中的 View 模型属性绑定(bind)到 StaticResource?

wpf - 寻找带有复选框的 WPF ComboBox

c# - 内容更新时自动调整 Listview 列的大小