@Smiz001
C#-developer

Как передать значение из одного ViewModel в другой?

Суть проблемы такова. Имеется главное окно, в котором лежит ListBox (В нем хранится List строк). Рядом с лист боксом лежат 3 кнопки (добавить, удалить и редактировать). Есть дочернее окно, в котором создается или редактируется строка ( которая была выбрана в лист боксе). Как мне передать из одной ViewModel в другую мою Строку?
Есть конечно идея при выполнении Команды добавить или редактировать, создавать ViewModel дочернего окна, туда передать в св-во нужную строку, потом создавать дочернюю View и там в DataContex передать созданную ранее ViewModel. Но мне кажется что этот подход не совсем корректный для MVVW.
  • Вопрос задан
  • 1569 просмотров
Решения вопроса 1
@SitrixEug
Основная суть MVVM - ViewModel ничего не знает об интерфейсе(View). View же о ViewModel знает. Поэтому создавать конкретную View в обработчике комманды конечно неправильно.
Но view можно связать с ViewModel в xaml коде, который уже является частью интерфейса, примерно так:
<DataTemplate DataType="{x:Type vm:TrollViewModel}">
    <v:TrollView />
  </DataTemplate>


А в обработчике комманды лишь создавать ViewModel. Примерно так:
protected void ShowWorkspace<T>() where T : WorkspaceViewModel, new()
        {
            WorkspaceViewModel workspace = this.Workspaces.FirstOrDefault(vm => vm is T) as T;

            if (workspace == null)
            {
                workspace = new T();
                this.Workspaces.Add(workspace);
            }

            this.SetActiveWorkspace(workspace);
        }

        protected void SetActiveWorkspace(WorkspaceViewModel workspace)
        {
            Debug.Assert(this.Workspaces.Contains(workspace));

            ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Workspaces);
            if (collectionView != null)
                collectionView.MoveCurrentTo(workspace);
        }


Подробнее об этом решении в статье автора

Строчку же можно передать в виде обьекта. ListView у тебя забинжена к какой-то коллекции Collection. Этот самый SomeObject передать в качестве параметра во ViewModel. Главное что-бы он наследовал интерфейс INotifyPropertyChanged.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@BashkaMen
C# программист
Не уверен что мой способ корректный, но я делал так:
При нажатии кнопки редактировать инициализирую viemodel и форму, потом подписываюсь на событие завершения редактирования, к примеру кнопка ОК на той форме, кидаю вьюмодел в datacontext той формы и показываю ее. Получается когда та форма завершит редактирование, тогда вы получите событие которое к примеру у вас заменит значение выделенного елемента.

Ещё есть вариант как по мне лучше и проще, сделайте юзер контрол контрол имеет текстбокс и тексблок, по умолчанию текстбокс(он сверху) скрыт, когда текст блок ловит событие двойного клика измените видимость текстбокса он даст возможность редактировать текст, ну а дальше думаю понятно :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы