WPF: связь между окнами на MVVM - PullRequest
0 голосов
/ 05 июня 2018

Я изо всех сил пытаюсь понять, как позволить нескольким окнам связываться друг с другом, используя шаблон MVVM.

У меня есть родительское окно P и два ребенка, называемые C1 и C2.Я хочу добиться того, чтобы, когда C1 изменяет свойство, общее для P, P уведомляется и сообщает об этом C2.

Я не хочу использовать общую ViewModel, так как хочу найти решение, котороеможет легко масштабироваться, и я даже не хочу, чтобы у C1 были одинаковые имена полей P и C2.

Это будет применяться к сменному набору инструментов, где я или другой человек можем создать сборку нового компонента (окно, например) и подписаться на уведомление, когда главное окно или другой компонент изменяет общие элементы.

Есть ли какой-то шаблон, который мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Есть какой-то шаблон, который мне не хватает?

Да.Вы можете использовать EventAggregator в Prism или Messenger класс в MvvmLight для отправки сообщения из одного окна в другое в слабосвязанной форме.Пожалуйста, обратитесь к следующим ссылкам для получения дополнительной информации о концепции.

https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

https://msdn.microsoft.com/en-us/magazine/jj694937.aspx http://dotnetpattern.com/mvvm-light-messenger

Каждое окно известно толькоо агрегаторе событий или мессенджере.Окна не знают или не зависят друг от друга.

0 голосов
/ 05 июня 2018

Я бы использовал для этого Призма .

Вот пример:

Класс, который вызовет событие:

public class MainViewModel
{
    public void UpdateName(string name)
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Publish(name);
    }
}

Два класса подпишутся на это событие:

public class Child1ViewModel
{
    public string Name { get; set; }

    public Child1ViewModel()
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
    }

    private void UpdateName(string name)
    {
        this.Name = name;
    }
}

и

public class Child2ViewModel
{
    public string Name { get; set; }

    public Child2ViewModel()
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
    }

    private void UpdateName(string name)
    {
        this.Name = name;
    }
}

EventAggregator, который является частью Prism. События находятся здесь:

public class Utility
{
    public static EventAggregator EventAggregator { get; set; }

    static Utility()
    {
        EventAggregator = new EventAggregator();
    }
}

И событие просто определяется следующим образом:

public class UpdateNameEvent : PubSubEvent<string>
{
}

Теперь попробуйте:

static void Main(string[] args)
{
    MainViewModel mainViewModel = new MainViewModel();
    Child1ViewModel child1 = new Child1ViewModel();
    Child2ViewModel child2 = new Child2ViewModel();
    mainViewModel.UpdateName("Name1");

    Console.WriteLine(child1.Name);
    Console.WriteLine(child2.Name);
}

ДляВ этом примере я использую консольное приложение.быстрее и строковый параметр, но вы можете заменить его в соответствии с вашими потребностями.Будь то подход MVVM или любой другой шаблон, вы можете легко реализовать этот тип связи.

Установите Prism.Core с помощью Nuget, и вы получите ссылку на Prism dll.

Еще раз: MainViewModel опубликует событие, и оба потомка будут подписаться на это событие.

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...