Usando genéricos, tenho uma classe base View Model - (MyBaseViewModel <T>
) que implementa um kit de ferramentas da comunidade RelayCommand. Isso é herdado por um ViewModel - MyDataInputControlViewModel : MyBaseViewModel <MyCustomType>
que suporta um controle de usuário de entrada de dados. O comando relay precisa atualizar um banco de dados com os dados do controle de usuário. Como passo os dados para <MyCustomType
o RelayCommand?
Então, estou tentando entender genéricos e herança e pensei que implementar um viewmodel base que lida com CRUD do banco de dados poderia economizar muito tempo repetindo comandos para todos os diferentes tipos de dados que precisam ir para o banco de dados. As ideias originais vieram do xamlbrewer , mas isso mantém os comandos de retransmissão no modelo de visualização de controle do usuário, o que eu poderia fazer, mas gostaria de colocá-los na classe base.
Código da classe base
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); }
Código do modelo de visualização de controle do usuário
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, }; }
O modelo do inquilino
[Table("tenants")]
public partial class Tenant
{
public string FirstName { get; set; }
}
Este é o xaml de teste que estou usando
<TextBox Text="{x:Bind ViewModel.FirstName, Mode=TwoWay}" Header="First Name" />
<Button Content="Add" Command="{x:Bind ViewModel.BaseAddNewRecordCommand}" />
Chamar o comando na classe base é bom, mas não consigo ver como criaria BaseNewItem a partir daí. Então, como vejo, o único lugar onde posso criar BaseNewItem é no UserControl ViewModel?? Sei que posso acessar BaseNewItem na classe base e na classe herdada, mas não consigo chamar CreateNewTenant da classe base. Então, minha pergunta é 'Como faço para obter BaseNewItem até a classe Base para ser usado no comando. Ou estou perdendo completamente o ponto em algum lugar?
Você pode usar um método abstrato :
e substituir os modelos de visualização derivados:
então use o comando assim: