首页 > 解决方案 > 如何将UI元素动态绑定到不同的对象WPF c#

问题描述

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

所以,考虑一下这个环境:我有一个班级Engine和另外两个班级classAclassB.

我有一个MainWindow.xaml由多个元素组成并Engine更新所有这些元素,但是有一个元素与classAor执行的指令绑定classB

我怎样才能做到这一点?

直到今天,我只有一节课,所以在

Engine : INotifyPropertyChanged

我有财产ClassA

而在我的

ClassA : INotifyPropertyChanged 

我有一个名为InfoAboutPerfomedInstruction

在我的 xaml 中,我有一个文本框,其中有一个文本绑定到Engine.ClassA.InfoAboutPerfomedInstruction

我应该有一个从 classA 和 classB 继承的泛型类吗?有更优雅的方法来做到这一点?

标签: c#wpf

解决方案


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


推荐阅读