связь между несколькими viewmodels

353
05 мая 2017, 15:25

У меня есть основная ViewModel которая содержит в себе коллекцию Group ViewModels

    public class NavigationVM:ViewModelBase
        {
            private ObservableCollection<NavigationGroupViewModel> _groupCollection;        
            public ObservableCollection<NavigationGroupViewModel> GroupCollection
            {
                get { return _groupCollection; }
                set
                {
                    if (_groupCollection != value)
                    {
                        _groupCollection = value;
                        OnPropertyChanged("GroupCollection");
                    }
                }
            }
...
...
}

в GroupViewModel у меня есть DeleteCurrentCommand который срабатывает при нажатие на ContextMenu item

private RelayCommand _deleteCurrentCommand;
        public RelayCommand DeleteCurrentCommand
        {
            get
            {
                if (_deleteCurrentCommand == null)
                {
                    _deleteCurrentCommand = new RelayCommand((o) =>
                    {
                        MessageBox.Show("Executed command is  " + "DeleteCurrentCommand");
                    });
                }
                return _deleteCurrentCommand;
            }
        }

Теперь мне нужно удалить этот элемент из коллекции GroupCollection которая находится в главном ViewModel NavigationVM. Как лучше и правильней это сделать? Можно ли подписаться на DeleteCurrentCommand event из NavigationVM?

Answer 1

Я бы добавил в NavigationVM свойство

NavigationGroupViewModel selectedItem;
public NavigationGroupViewModel SelectedItem
    {
        get { return selectedItem; }
        set
        {
            if (value != null)
                if (value.Equals(selectedItem))
                    return;
            selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }

в xaml к элементу, к которому привязана Ваша коллекция добавил бы

SelectedItem="{Binding SelectedItem}"

команду удаления также перенес бы в NavigationVM

private RelayCommand _deleteCurrentCommand;
    public RelayCommand DeleteCurrentCommand
    {
        get
        {
            if (_deleteCurrentCommand == null)
            {
                _deleteCurrentCommand = new RelayCommand((o) =>
                {
                    SelectedItem.Delete();
                    GroupCollection.Remove(SelectedItem);
                    OnPropertyChanged("GroupCollection");
                });
            }
            return _deleteCurrentCommand;
        }
    }

Соответственно, MenuItem в ContextMenu привязал бы к этой команде.

Answer 2

Это по сути не вопрос по MVVM. У вас есть несколько объектов, как им друг с другом связаться?

Ответ — как угодно.

Например, в вашем случае я бы просто передавал ссылку на внешнюю VM в конструктор NavigationGroupViewModel, и внутри реализации DeleteCurrentCommand тупо вызывал бы публичный метод, передавая себя в качестве аргумента.

READ ALSO
Имитация нахождения на странице

Имитация нахождения на странице

Есть сайт, суть сайта заключается в том что человек вставляет свою фотографию и сайт накручивает лайкиДо сайта можно достучаться через httр://example

315
С#. WinApi. Рисование на окне

С#. WinApi. Рисование на окне

Нужно написать на С# программу, которая будет определять над каким окном Windows сейчас находится курсор и обводить это окно рамкой (указывая...

350
InvalidCastException при преобразовании IQueryable в List

InvalidCastException при преобразовании IQueryable в List

Есть БД SQLiteВ ней есть таблица Studios со следующей структурой:

407
Нули при отображении даты (date) в БД MSSQL

Нули при отображении даты (date) в БД MSSQL

У меня есть значение даты в формате 405

282