cesar.iriso Ответов: 0

Изменить значение 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/
Спасибо всем.

0 Ответов