J'ai une liste de CustomerViewModels dans un ComboBox. Le CustomerViewModel sélectionné que je veux supprimer ainsi que le client qui l'a enveloppé pour le retirer du référentiel. Mais comment puis-je accéder au modèle client dans CustomerViewModel?MVVM: Supprimer un CustomerViewModel, mais comment obtenir le modèle client à l'intérieur?
Répondre
Juste une suggestion, faites votre collection de customerviewmodels un ObserableCollection de CustomerViewModels. ce que cela vous achète est un événement CollectionChanged que vous pouvez écouter avec un délégué des changements à la collecte-à-dire la suppression, donc de vous pourriez y manipuler vous le modèle en conséquence
http://msdn.microsoft.com/en-us/library/ms653375(VS.85).aspx
peut-être quelque chose comme
public class CustomersViewModel: ViewModelBase
{
public ObservableCollection<CustomersViewModel> Customers { get; private set; }
public CustomersViewModel()
{
Customers = new ObservableCollection<CustomersViewModel>(GetCustomers());
Customers.CollectionChanged +=
(sender, args) =>
{
if (args.Action == NotifyCollectionChangedAction.Remove)
{
foreach (CustomerViewModel customerViewModel in args.NewItems)
{
DeleteCustomer(customerViewModel.Customer);
}
}
};
}
private void DeleteCustomer(Customer customer)
{
// Call into your repo and delete the customer.
}
private List<CustomersViewModel> GetCustomers()
{
// Call into your model and return customers.
}
... ICommands ect...
}
utilisent déjà ObservableCollection etc ... Tout ici est bien de configuration n'a tout simplement pas voir que mon objet client dans la classe CustomerViewModel a un « _ » char au début du nom de l'instance afin Je ne l'ai pas vu quand j'ai tapé "SchoolclassViewModel". ;-) Je mets cela dans le CustomerViewModel: Schoolclass publique SelectedSchoolclass {get {return _schoolclass;}} pour obtenir le client ... thx à nouveau sans ce poste, je ne reviendrai pas peut-être vu mon erreur typographique ; P – msfanboy
:) à tout moment, ici pour aider –
Vous pourriez avoir déjà accès à l'intérieur Customer
CustomerViewModel
(le VieModel doit exposer les propriétés du Customer
, la vue peut DataBind sur eux, je le fais habituellement, il en exposant le Customer
ou une copie de celui-ci directement).
Le point est que vous ne devrait pas supprimer le Customer
vous-même. C'est ce que le ViewModel
est pour, pour exposer un ICommand
qui supprime le Customer
associé. Selon le framework MVVM que vous utilisez, recherchez DelegateCommand
ou un autre équivalent.
Votre CustomerViewModel
aurait un
public ICommand DeleteCommand { get; private set; }
et votre vue lierait un CommandTarget
(probablement un Button
) à cette commande. Lorsque la commande est exécutée, une méthode privée de CustomerViewModel
est exécutée et vous pouvez supprimer le Customer
sans exposer le mécanisme de suppression à d'autres parties du code. Par exemple:
public CustomerViewModel()
{
this.DeleteCommand = new DelegateCommand(this.ExecuteDeleteCommand);
}
private void ExecuteDeleteCommand()
{
// remove the Customer from the ObservableCollection of customers
// and also delete it from the database, or do anything else you want
}
bien
également parfaitement valide –
cela pourrait fonctionner: _customerRepo.Delete (nouveau client() { = CustomerID SelectedCustomerViewModel.CustomerID, = FirstName SelectedCustomerViewModel.FirstName, }); mais semble plus un hack ... – msfanboy