使用EFCore重用MVVM模式上的视图



我正在使用EF Core和MVVM模式,我不知道如何继续创建一个;"可重复使用";看法

我有一个视图,其中有一个带有常见操作(CRUD和筛选(的菜单条和一个将通过EF Core填充的DataGrid。我有一堆不同的模型(所有这些模型都继承了一个具有单个int ID属性的简单基本模型类(,我需要显示我的数据。

现在,根据DRY的说法,由于视图实际上是相同的,我不应该为每个模型创建不同的视图,只需要创建一个通用视图并相应地填充它。此外,我在这里读到,视图模型通常是不可重用的,所以我需要每个模型一个视图模型。这是我的问题。

在创建我的视图时,我被教导了这个模式:

public class StockView : Window
{
private StockViewModel _viewModel;
public StockView(StockViewModel viewModel)
{
InitializeComponent();
_viewModel = viewModel ?? new StockViewModel();
DataContext = _viewModel;
}
}

但是,这意味着这个视图只能接受StockViewModel,所以我不能重用它

public class GenericView : Window
{
private ViewModelBase _viewModel;
public GenericView(ViewModelBase viewModel)
{
InitializeComponent();
_viewModel = viewModel ?? new ViewModelBase();
DataContext = _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>
}
}

那么,我如何能够为不同的视图模型重用视图呢?

不允许异步抽象方法。。。

否,但async是一个实现细节。Abstract类或接口仍然可以定义一个返回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 ...
}
}

最新更新