我正在使用 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/