Изменить значение DataContext представления от другой модели ViewModel в WPF
Доброе утро, товарищи. Я хотел бы знать, как я могу изменить DataContext представления с его ViewModel, из другого ViewModel или из того же ViewModel.
Программа представляет собой тест, который будет использоваться позже в другом проекте. В основном это два элемента управления UserControl внутри окна, каждый со своей соответствующей ViewModel. Реализуйте интерфейсы INotifyPropertyChanged и ICommand с NotifyBase и RelayCommand.
В поле зрения 1
<Button Grid.Column="0" Margin="30" Height="120" CommandParameter="Button1ViewModelIzdo" Command="{Binding Btn1Command}">
В ViewModel1:
public class Window1ViewModel : NotifyBase { public delegate void EventHandler(object sender, CustomEventArgs e); public event EventHandler ThrowEvent;// = delegate { }; private ICommand _btn1Command; public ICommand Btn1Command { get { return _btn1Command ?? (_btn1Command = new RelayCommand((parameter) => Bnt1Action(parameter))); } } private void Bnt1Action(object parameter) { String msg = parameter as String; ThrowEvent?.Invoke(this, new CustomEventArgs(msg)); }
В Поле Зрения 2
<TextBlock TextAlignment="Center" x:Name="Data" Text="{Binding Path=Data,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock
В ViewModel2
public class Window2ViewModel : NotifyBase { private Window1ViewModel _Thrower; public Window2ViewModel() { _Thrower = new Window1ViewModel(); _Thrower.ThrowEvent += ( emisor, e) => { ChangeData(emisor , e); }; } private string _data; public string Data { get { return _data; } set{ if (_data != value) { _data = value; OnPropertyChanged("Data"); } } } private void ChangeData(object emisor, CustomEventArgs e) { Data = e.msg; MessageBox.Show("Hell0"); } }
Класс CustomEventArgs имеет msg propedad. Но событие не стартует. Что я делаю не так?
Заранее большое спасибо. Приветствую Тебя, Цезарь.
Что я уже пробовал:
Использование делегатов и событий поиск примеров в stackoverflow и codeproject
Dirk Bahle
Привет я не уверен в чем именно заключается Ваш вопрос но вы должны исследовать поведение https://stackoverflow.com/questions/8360209/how-to-add-system-windows-interactivity-to-project
или "прикрепленные поведения", если вы хотите распространять события из элемента управления WPF в viewmodel с помощью привязки команд (если вы не можете изменить исходный код элемента управления)
cesar.iriso
Спасибо Дирк. Я читаю https://stackoverflow.com/questions/1939414/wpf-should-a-user-control-be-supplied-with-a-viewmodel?rq=1 .
Кажется, что это не хорошая идея, чтобы связать просмотр моделей с UserControl
Приветствие "Сезар".
Dirk Bahle
Связь между viewmodel и usercontrol через datacontext в принципе ОК - но есть технические причины, по которым события/команды должны быть с их конкретными шаблонами ...
Dirk Bahle
Не уверен, что это поможет, но это может быть что-то, чтобы рассмотреть.
Вот пример элемента управления, который будет наблюдать событие DataContextChanged и присоединяться к viewmodel, реализующему интерфейс IEditBox:
https://github.com/Dirkster99/InplaceEditBoxLib/blob/master/source/InplaceEditBoxLib/Views/EditBox.xaml.cs
Это позволяет viewmodel получать пузырьковые уведомления через элемент управления. Это означает, что viewmodel не нужно беспокоиться о части пользовательского интерфейса уведомления - его беспокоит только требуемое событие ...
cesar.iriso
Слишком сложно для меня, я немного новичок :)
Но все равно спасибо.
Graeme_Grant
Вы хотите поделиться данными между двумя моделями представления, которые не связаны?
cesar.iriso
Как мне сделать ссылку? В ViewModel MainWindow ?
Graeme_Grant
Мой вопрос-это двоичный ответ " да " или "нет"... если нет, пожалуйста, объясните более подробно...
cesar.iriso
То, что я пытаюсь сделать, - это тест. В представлении у меня есть два элемента управления UserControls
У одного есть кнопка, а у другого-текстовый блок. Каждый UserControl имеет свою собственную ViewModel. Кнопка привязывается с помощью Command и CommandParameter к своей ViewModel, а другая ViewModel привязывает TextBlock к свойству во второй ViewModel. В принципе эти две модели представления не связаны между собой
Действие, связанное с RelayCommand, вызывает событие, которое должно быть подхвачено другим ViewModel для изменения свойства во втором ViewModel, но
хотя ThrowEvent? .Invoke (this, new CustomEventArgs (msg)); run ,вторая модель представления не получает событие.
Richard Deeming
Похоже, вы ищете образец посредника.
cesar.iriso
Это кажется интересным. Я собираюсь взглянуть.
Большое тебе спасибо, Ричард.
cesar.iriso
Решенный. Паттерн посредника работает отлично.
http://www.technical-recipes.com/2016/using-the-mediator-pattern-in-mvvm-wpf/
Спасибо всем.