Управление коллекциями и шаблоном ViewModel - PullRequest
1 голос
/ 02 июня 2010

Я относительно новичок в WPF, и у меня возникли проблемы с тем, что, я уверен, является относительно простой проблемой.

У меня есть базовый объект данных, Person:

class Person
{
    public string Surname {get; set; }
    public string Firstname {get; set; }
    public List<Address> Addresses {get; }
}

И я хочу отобразить и отредактировать этот объект в моем приложении WPF. Для этого я создал ViewModel, к которому привязываю свой xaml:

class PersonViewModel
{
    public string Fullname {get; }
    public ObservableCollection<AddressViewModel> Addresses {get; }
}

Это нормально, за исключением случаев, когда нужно манипулировать моей коллекцией адресов, где я не могу понять, что мне следует делать:

  • Должен ли я добавить методы AddAddress, RemoveAddress и т. Д. ... в мой класс PersonViewModel для управления моей коллекцией с экземплярами AddressViewModel
  • Должен ли я просто добавить экземпляры AddressViewModel в мою Addresses наблюдаемую коллекцию

Оба вышеперечисленных кажутся немного грязными - есть ли лучший способ работы с коллекциями?

1 Ответ

2 голосов
/ 02 июня 2010

Я бы порекомендовал добавить команды в вашу ViewModel. Например, у вас есть AddAddressCommand и RemoveAddressCommand. Вы можете привязать эти команды к представлению (например, вы можете привязать кнопку к AddAddressCommand), которая будет выполнять метод в вашей ViewModel, который будет добавлять в коллекцию.

        public ObservableCollection<AddressViewModel> Addresses { get; set; }

    public RelayCommand AddAddressCommand
    {
        get
        {
            if (_addAddressCommand == null)
            {
                _addAddressCommand = new RelayCommand(p => this.AddAddress_Execute());
            }
            return _addAddressCommand;
        }
    }

    private void AddAddress_Execute()
    {
        Addresses.Add(new AddressViewModel());
    }

(В приведенном выше примере я использую RelayCommand, это пользовательский класс, который реализует ICommand, вы можете прочитать больше об этом RelayCommand здесь

Также примечание: я бы не стал создавать AddressViewModel. У меня просто была бы AddressModel, которая реализует INotifyPropertyChanged. Нет необходимости в другой модели представления адреса, если у вас нет логики отображения, которой нет в вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...