Использую WPF и паттерн MVVM. Хочу передать из одной viewmodel в другую значения(допустим текст). Подключаю DataContext в разметке xaml в обеих viewmodel
<Window.DataContext>
<vm:MWVM/>
</Window.DataContext>
<Page.DataContext>
<vm:W1VM/>
</Page.DataContext>
Пробовал разные варианты, значение передается. И через перегрузку конструктора, и через доп методы класса, и через инициализатор.
private RelayCommand _pageWindow1;
public RelayCommand PageWindow1
{
get
{
return _pageWindow1 ??
(_pageWindow1 = new RelayCommand(obj =>
{
var vm = new W1VM("asdasdas")
{
Page1 = new Page1(),
//Text = "Hello"
};
SlowOpacoty(vm.Page1);
//vm.Send();
}));
}
}
Но когда я нажимаю на кнопку во второй viewmodel, в переменной text почему-то всегда оказывается NULL.
private RelayCommand _tCommand;
public RelayCommand TCommand
{
get
{
return _tCommand ??
(_tCommand = new RelayCommand(obj =>
{
MessageBox.Show(text);
}));
}
}
Подключаю DataContext в разметке xaml- зря, ой как зря... По поводу вопроса -значение передается..Но когда я нажимаю на кнопку ..в переменной text .. всегда оказывается NULL, как такое может быть, если оно передается? Где тогда теряете, на каком этапе? P.S.Page1- я надеюсь вы неFrameиспользуете?.. – EvgeniyZ Mar 18 '19 at 20:41DataContext- я цитату хорошего человека вам покажу (VladD): 1. С точки зрения идеологии MVVM, View не может управлять VM. А когда View создаёт себе VM, она, очевидно, им управляет. 2. С практической точки зрения, если у нас есть несколько VM, и мы хотим их «связать», то нам недостаточно использовать конструкторы наших VM по умолчанию. Например, одна из VM может хотеть ссылку на другую. Если мы ограничиваемся созданием VM в XAML, мы получаем обязательное использование конструктора по умолчанию, и обязательно новую VM у каждого экземпляра контрола/окна. Это очень часто не то, чего мы хотим. – EvgeniyZ Mar 19 '19 at 11:53Frame- Тут дело в том, что он довольно плохо взаимодействует с MVVM подходом, у него есть много своих недостатков, ну и ко всему прочему он как по мне лишний. Хотите другое содержимое с MVVM подходом, используйте например такой подход. И вот если вы все это переделаете (DataContext и Frame), то у вас не составит труда передать данные из VM в VM, ибо это делается простым конструктором.. – EvgeniyZ Mar 19 '19 at 11:57var vm = new W1VM("asdasdas") { Page1 = new Page1() };, то есть инициализируете отдельно VM, которая не как не связана сPage, да в ней есть Page, но не в Page есть VM. А приnew Page1()у вас создается другая VM, ибо вы ее задали в XAML. Вот и подумайте, где у вас переданное вами значение... – EvgeniyZ Mar 19 '19 at 12:01protected override void OnStartup(StartupEventArgs e)). Там вы также можете найти решение длязато вижу все команды и свойства во ViewModel(пункт 2 в "Убираем лишнее"). – EvgeniyZ Mar 19 '19 at 12:26