c# - 如何将UI元素动态绑定到不同的对象WPF c#
问题描述
我有一个关于如何动态绑定元素与多个不同对象的问题。
所以,考虑一下这个环境:我有一个班级Engine
和另外两个班级classA
,classB
.
我有一个MainWindow.xaml
由多个元素组成并Engine
更新所有这些元素,但是有一个元素与classA
or执行的指令绑定classB
。
我怎样才能做到这一点?
直到今天,我只有一节课,所以在
Engine : INotifyPropertyChanged
我有财产ClassA
。
而在我的
ClassA : INotifyPropertyChanged
我有一个名为InfoAboutPerfomedInstruction
在我的 xaml 中,我有一个文本框,其中有一个文本绑定到Engine.ClassA.InfoAboutPerfomedInstruction
我应该有一个从 classA 和 classB 继承的泛型类吗?有更优雅的方法来做到这一点?
解决方案
如果我正确理解了这个问题,那么您希望 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;
}
}
这个父对象是你的视图绑定的对象。这样做的好处是:
- 视图对 ClassA 或 ClassB 或它们如何更新值的逻辑一无所知
- 您可以轻松地在整个逻辑代码中放置断点,以确保它使用调试器正确运行
- 你可以对它进行单元测试
更进一步,ClassA/ClassB 是 ParentViewModel 中 IMyIterface 类型的属性,通过依赖注入框架设置,但这是另一篇文章的主题。
推荐阅读
- c++ - 对象变量不更新
- png - ImageResizer:System.BadImageFormatException 导致 Web 应用程序崩溃,尽管在 try ... catch
- json - Flutter:从 JSON 渲染 UI 并动态存储/映射数据
- sql - 如何识别连续几年发生的事件?
- javascript - 有没有一种技术可以从数组中删除一个值“this”的项目?
- php - 验证单选按钮 Laravel 5.4
- sql - 为什么 Hive 中的 SUM(a + b) != SUM(a) + SUM(b) ?
- java - 如何在睡眠模式下使用移动网络运行后台服务?
- python - 基于 Sift 特征的光流?
- javascript - 仅在 IOS 上发生的 CORS 问题