У меня есть основная 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?
Я бы добавил в 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 привязал бы к этой команде.
Это по сути не вопрос по MVVM. У вас есть несколько объектов, как им друг с другом связаться?
Ответ — как угодно.
Например, в вашем случае я бы просто передавал ссылку на внешнюю VM в конструктор NavigationGroupViewModel, и внутри реализации DeleteCurrentCommand тупо вызывал бы публичный метод, передавая себя в качестве аргумента.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости