Как динамически привязать элемент пользовательского интерфейса к другому объекту WPF c # - PullRequest
0 голосов
/ 01 февраля 2019

У меня вопрос о том, как динамически связать элемент с несколькими различными объектами.

Итак, рассмотрим эту среду: у меня есть класс Engine и два других класса classA и classB.

У меня есть MainWindow.xaml, который состоит из нескольких элементов, и Engine обновляет все из них, но есть элемент, связанный с инструкцией, выполняемой classA или classB.

Как мне этого добиться?

До сегодняшнего дня у меня был только один класс, поэтому в

Engine : INotifyPropertyChanged

у меня было свойство ClassA.

И вmy

ClassA : INotifyPropertyChanged 

У меня было свойство с именем InfoAboutPerfomedInstruction

В моем xaml есть текстовое поле с текстом, связанным с Engine.ClassA.InfoAboutPerfomedInstruction

Должен ли я иметьуниверсальный класс, который наследует от classA и classB?Есть более элегантный способ сделать это?

1 Ответ

0 голосов
/ 01 февраля 2019

Если я правильно понимаю вопрос, то вы хотите, чтобы и ClassA, и ClassB могли обновлять одно и то же свойство, верно?Если это так, то у меня будет интерфейс, который поддерживает обратный вызов для этого свойства, поэтому что-то вроде этого:

public class IMyIterface
{
    event EventHandler<int> OnChanged;
}

ClassA и ClassB должны оба реализовать этот интерфейс и вызывать его, когда они хотят изменить значение:

public class ClassA : IMyIterface
{
    public event EventHandler<int> OnChanged;

    public void SomethingChanged()
    {
        this.OnChanged?.Invoke(this, 42);
    }
}

// .. same for ClassB...

Затем у вас есть некоторый родительский объект, который создает их, реализует само значение с помощью INPC и подписывается на эти события:

public class ParentViewModel
{
    private ClassA ClassA = new ClassA();
    private ClassB ClassB = new ClassB();

    public int MyValue ... // <- implements INPC

    public ParentViewModel()
    {
        this.ClassA.OnChanged += (s, e) => this.MyValue = e;
        this.ClassB.OnChanged += (s, e) => this.MyValue = e;
    }
}

Этот родительский объект - это то, к чему привязывается ваше представление.Преимущества таких вещей:

  1. представление ничего не знает о ClassA или ClassB или логике того, как они обновляют значение
  2. , которое вы можете легко указатьТочки останова в вашем логическом коде, чтобы убедиться, что он работает правильно с помощью отладчика
  3. , вы можете выполнить его модульное тестирование

Сделайте этот шаг еще дальше, и ClassA / ClassB - это свойства в ParentViewModel типа IMyIterfaceкоторые устанавливаются через инфраструктуру внедрения зависимостей, но это тема для другого поста.

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