使用泛型,我有一个基类 View Model - (MyBaseViewModel <T>
),它实现了社区工具包 RelayCommand。它由 ViewModel - MyDataInputControlViewModel 继承:MyBaseViewModel<MyCustomType>
支持数据输入用户控件。中继命令需要使用来自用户控件的数据更新数据库。我如何将数据传递<MyCustomType
给 RelayCommand?
因此,我尝试理解泛型和继承,并认为实现一个处理数据库 CRUD 的基本视图模型可以节省大量重复输入数据库的所有不同数据类型的命令的时间。最初的想法来自xamlbrewer,但它将中继命令保留在用户控件视图模型中,我可以这样做,但我想将它们放入基类中。
来自基类的代码
public abstract partial class ObservableNavigationAwareViewModelBase<T> : ObservableObject, INavigationAware
{
readonly DatabaseDAO _databaseDAO;
private T BaseNewItem;
public ObservableNavigationAwareViewModelBase(DatabaseDAO databaseDAO) { _databaseDAO = databaseDAO; }
[RelayCommand]
private void BaseAddNewRecord() { _databaseDAO.SaveNewRecord(BaseNewItem); }
来自用户控件视图模型的代码
public partial class AddNewTenantViewModel : ObservableNavigationAwareViewModelBase<Tenant>
{
DatabaseDAO _databaseDAO;
public string FirstName { get; set; }
public AddNewTenantViewModel(DatabaseDAO databaseDAO) : base (databaseDAO)
{_databaseDAO = databaseDAO;}
private void CreateNewTenant()
{ BaseNewItem = new Tenant() { FirstName = FirstName, }; }
租户模型
[Table("tenants")]
public partial class Tenant
{
public string FirstName { get; set; }
}
这是我正在使用的测试 xaml
<TextBox Text="{x:Bind ViewModel.FirstName, Mode=TwoWay}" Header="First Name" />
<Button Content="Add" Command="{x:Bind ViewModel.BaseAddNewRecordCommand}" />
在基类中调用命令是可以的,但我看不出如何从那里创建 BaseNewItem。所以在我看来,我可以创建 BaseNewItem 的唯一地方是在 UserControl ViewModel 中?我知道我可以在基类和继承类中访问 BaseNewItem,但我不能从基类调用 CreateNewTenant。所以我的问题是“如何让 BaseNewItem 到达基类以在命令中使用。还是我完全错过了重点?
您可以使用抽象方法:
并覆盖派生的视图模型:
然后使用如下命令: