【发布时间】:2015-10-22 23:09:23
【问题描述】:
我正在做一些我以前从未尝试过的事情。我正在尝试创建动态 UI 并将其绑定到动态模型。换句话说,我的 Web 服务将发回我的 UI 的小元数据描述以及要绑定到它的原始数据。因此,在构建时,我不知道我将构建什么 UI,也不知道我的模型将是什么。将它们绑定在一起似乎非常困难,如果不是不可能的话。
Mvx 允许我将 UI 直接绑定到模型而不是 MvxViewModel。但是,如果我直接绑定到 Web 服务返回的模型,我将失去 RaisePropertyChanged() 的能力,因为它仅来自 MvxViewModel。
通常,我会编写一个包装模型的 ViewModel,并让所有包装的 setter 调用 RaisePropertyChanged()。但是,在这种情况下,我的模型是动态的,所以我不能在编译时用 ViewModel 包装它,因为直到运行时我才知道它是什么。
我可以使用一些很酷的技巧来构造一个 ViewModel,它可以包装任何 C# 模型类并发送属性更改事件,而无需知道模型类在运行时之前具有哪些属性?
我刚刚发现 DLR 和 DynamicObject 似乎很完美,但由于 Apple 的限制,它不适用于 Xamarin.iOS。
【问题讨论】:
-
我也有类似的要求。我将动态数据存储为 JSON 对象。为了进行数据绑定,我将其转换为处理属性更改通知的 ObservableDictionary。在视图中,我创建了一个绑定集并手动将我的视图控件绑定到字典。它工作得很好。我不在电脑前,但我明天会发布一个示例。
-
我认为如果问题中有一些具体的代码会更容易查看 - 实际查看/实验的东西。目前我不完全确定您的(视图)模型中的值发生了什么变化 - 它总是绑定 UI 控件,还是其他什么? (我不确定我是否了解您的更改通知将在哪里生成)
-
WPF 也尊重TypeDescriptors,因此您可以根据来自服务器的数据动态创建类型描述符。不知道邪恶的 ios 霸主是否压制了反射。
标签: dynamic mvvm mvvmcross inotifypropertychanged