Dynamic 没有ViewModel的数据绑定

Dynamic 没有ViewModel的数据绑定,dynamic,mvvm,mvvmcross,inotifypropertychanged,Dynamic,Mvvm,Mvvmcross,Inotifypropertychanged,我正在做我以前从未尝试过的事情。我正在尝试创建动态UI并将其绑定到动态模型。换句话说,我的web服务将返回一个小的UI元数据描述和绑定到它的原始数据。因此,在构建时,我不知道我将构建什么UI,也不知道我的模型将是什么。如果不是不可能的话,将它们结合在一起似乎非常困难 Mvx允许我将UI直接绑定到一个模型,而不是MvxViewModel。但是,如果我直接绑定到web服务返回的模型,我将失去RaisePropertyChanged()的功能,因为它只来自MvxViewModel 通常,我会编写一个V

我正在做我以前从未尝试过的事情。我正在尝试创建动态UI并将其绑定到动态模型。换句话说,我的web服务将返回一个小的UI元数据描述和绑定到它的原始数据。因此,在构建时,我不知道我将构建什么UI,也不知道我的模型将是什么。如果不是不可能的话,将它们结合在一起似乎非常困难

Mvx允许我将UI直接绑定到一个模型,而不是MvxViewModel。但是,如果我直接绑定到web服务返回的模型,我将失去RaisePropertyChanged()的功能,因为它只来自MvxViewModel

通常,我会编写一个ViewModel来包装模型,并让所有包装的setter调用RaisePropertyChanged()。然而,在这种情况下,我的模型是动态的,所以我不能在编译时用ViewModel包装它,因为直到运行时我才知道它是什么

是否有一些很酷的技巧可以用来构造一个ViewModel,它可以包装任何C#model类并发送属性更改事件,而不知道该模型类在运行时之前具有哪些属性


我刚刚发现DLR和DynamicObject似乎很完美,但由于苹果的限制,它无法在Xamarin.iOS上运行。

如果不将
DynamicObject
引入iOS的生活,我想到的主要方法是:

  • 您可以更改Web服务生成代码,使其生成
    INotifyPropertyChanged
    ——我使用过这样做的库—例如—如果您不能更改Web服务代码生成本身,您仍然可以使用某种t4或其他模板技巧包装或篡改生成的代码

  • 您可以研究将web服务对象映射到某种可观察集合的某种代码(Kiliman在评论中提出了这一点)

  • 您可以看看某种类型的valueconverter(或者valuecombiner),它执行绑定-我可以很容易地想象一个valueconverter,它接受一个包装的模型对象和一个字符串参数(属性名称),并将这两个参数结合使用(通过一些反射)来解决该做什么。我不太确定这个如何处理嵌套的模型对象。。。但即使这样也有可能

  • 您可以查看MvvmCross的某种自定义绑定扩展。这并不像听起来那么可怕,但确实需要一些反射技巧-要了解可能涉及的内容,请查看FieldBinding插件-

    在实际的数据绑定过程中,将通过
    IMvxSourceBindingFactoryExtension
    调用插件-这将是您连接到其他自定义更改
    事件的机会(而不是
    INotifyPropertyChanged
    )。这可能需要一点实验才能正确。。。特别是如果您有嵌套对象(需要在绑定中进行“链接”)。。。但我认为这样做应该是可能的


  • 我不确定我最终确定的是否支持所有可能的功能,但到目前为止,它似乎满足了我所需要的一切

    我非常喜欢自己编写
    IMvxSourceBindingFactoryExtension
    的想法。然而,在研究如何做到这一点时,我开始使用MvvmCross中已经存在的功能。我已经知道MvvmCross将尊重一个
    可观察收集
    。我不知道的是,我可以在绑定表达式中使用
    []
    ,这不仅可以使用整数索引器,还可以使用
    字典上的字符串索引器。我发现MvvmCross-sample代码已经在其GIT-repo中实现了
    observedictionary
    。事实证明,这就是我解决问题所需要的全部

    因此,我的模型包含静态属性和动态属性的
    observedictionary
    ,其中键是动态属性的名称,值是属性的值

    My
    ViewModel
    包装此模型类以发送有关静态属性的
    PropertyChanged
    通知。由于动态属性的
    字典
    是可见的,因此MvvmCross已经处理对该字典成员的更改,包括双向更改

    最后一个问题是如何在绑定表达式中绑定到它。这就是
    []
    的用武之地。如果我的
    observedictionary
    属性名被调用
    UserValues
    ,并且它在键
    user1
    处包含一个值,那么我可以使用:
    UserValues[user1]
    双向绑定到它,并且一切看起来都很正常


    我看到的一个问题是,我现在要求我的动态数据源向我返回一个
    observedictionary
    ,而不仅仅是一个
    字典。这要求太高了吗?

    我也有类似的要求。我将动态数据存储为JSON对象。要进行数据绑定,我将其转换为ObservableDedictionary,它处理属性更改通知。在视图中,我创建了一个绑定集,并手动将视图控件绑定到字典。它工作得很好。我不在我的电脑前,但我明天会发布一个示例。我认为如果问题中有一些具体的代码——一些可以实际查看/实验的代码,那么会更容易查看这个示例。目前,我不完全确定(视图)模型中的值在发生什么变化——它总是绑定UI控件,还是其他什么?(我不确定我是否理解将在何处生成更改通知)WPF也尊重这一点,因此您可以根据来自服务器的数据动态创建类型描述符。不确定邪恶的ios霸主是否会压制反射,虽然。反应很好。这些都是我要调查的好建议。我将在这里发布我的结果。我认为其中一个关键是定义改变机制(这可能与一些