MVVM: Удалить CustomerViewModel, но как получить модель Customer внутри? - PullRequest
1 голос
/ 30 апреля 2010

У меня есть список CustomerViewModels в ComboBox. Выбранная CustomerViewModel, которую я хочу удалить, а также Customer, завернутый в нее, чтобы удалить ее из хранилища.

Но как я могу получить доступ к модели Customer внутри CustomerViewModel?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Просто предложение, сделайте вашу коллекцию моделей представления о клиентах ObserableCollection of CustomerViewModels. то, что он покупает у вас, это событие CollectionChanged, которое вы можете прослушивать с делегатом на предмет изменений в коллекции, т. е. удаления, поэтому оттуда вы можете соответствующим образом манипулировать своей моделью

http://msdn.microsoft.com/en-us/library/ms653375(VS.85).aspx

возможно что-то вроде

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... 

}
1 голос
/ 24 марта 2011

Возможно, у вас уже есть доступ к Customer внутри CustomerViewModel (VieModel необходимо предоставить свойства Customer, чтобы View мог связать их с данными; я обычно делаю это, выставляя Customer или копия этого непосредственно).

Дело в том, что вы не должны удалять Customer самостоятельно. Вот для чего нужен ViewModel, чтобы выставить ICommand, который удаляет связанный Customer. В зависимости от того, какую платформу MVVM вы используете, посмотрите DelegateCommand или другой эквивалент.

Ваш CustomerViewModel будет иметь

public ICommand DeleteCommand { get; private set; }

и ваш вид привязывает CommandTarget (вероятно, Button) к этой команде. Когда команда будет выполнена, будет запущен закрытый метод CustomerViewModel, и вы можете удалить Customer оттуда, не подвергая механизм удаления другим частям кода. Например:

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
}
...