如何将UI元素动态绑定到其他对象WPF c#

时间:2019-02-01 09:59:37

标签: c# wpf

我有一个问题,如何动态地将一个元素与多个不同的对象绑定。

因此,请考虑以下环境:我有一个类Engine和另外两个类classAclassB

我有一个MainWindow.xaml,它由多个元素组成,并且Engine更新所有这些元素,但是有一个元素与classA或{{1}执行的指令绑定}。

我该如何实现?

直到今天,我只有一堂课,

classB

我有一个财产Engine : INotifyPropertyChanged

在我的

ClassA

我有一个名为ClassA : INotifyPropertyChanged

的属性

在我的xaml中,我有一个textBox,其文本绑定到InfoAboutPerfomedInstruction

我应该有一个继承自classA和classB的泛型类吗?有更优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么您希望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是类型IMyIterface的ParentViewModel中的属性,这些属性是通过依赖项注入框架进行设置的,但这是另一篇文章的主题。