【问题标题】:MVVMCross add multiple dynamic properties to viewmodelMVVMCross 为 viewmodel 添加多个动态属性
【发布时间】:2020-03-18 13:16:23
【问题描述】:

我需要根据服务响应动态呈现屏幕(屏幕类型:表单)(而不是手动定义 UI)。我能够成功地将预定义属性绑定到动态创建的文本框和文本视图。以下是用于将预定义属性绑定到动态文本框的示例代码

Type myType = typeof(DynamicViewModel);
PropertyInfo myPropInfo = myType.GetProperty(nameof(dynamicProperty)); //dynamicProperty -static property in VM
var set = this.CreateBindingSet<DynamicActivity, DynamicViewModel>();
set.Bind(editText).To(myPropInfo.Name); //editText - dynamically created textbox
set.Apply();

但是代码需要通过动态创建属性的数量来进一步改进 - 与动态创建的 UI 元素的数量相匹配。 该项目是使用 Xamarin.Android 和 MVVMCross 的最新版本创建的。请分享在可以与动态生成的视图元素(文本框和文本视图)绑定的视图模型中生成动态字符串(或对象类型)属性的方法。

谢谢

【问题讨论】:

    标签: c# xamarin mvvmcross


    【解决方案1】:

    有几种方法可以做到这一点。

    其中一个正在使用反射,但您可能会遇到性能问题。

    另一种方法是将您从服务器获取的数据和模型稍微整理一下,以便您可以使用一些工厂来构建您的视图/VM:

    可能是这样的:

    public enum DataType
    {
        String,
        Number,
        Boolean,
        List,
        // and any other types that you need
    }
    
    public class OptionItemModel
    {
        public int Id { get; set; }
    
        public string Name { get; set; }
    }
    
    public class FieldModel
    {
        public DataType Type { get; set; }
    
        public string DefaultValue { get; set; } // this is a serialized value
    
        public List<OptionItemModel> Options { get; set; } // this only applies to DataType -> List
    }
    
    public class StructureModel
    {
        public List<FieldModel> Fields { get; set; }
    }
    

    因此,您可以在您的虚拟机上拥有一个ObservableCollection,并且您的项目可以通过工厂迭代结构的每个字段来创建,因此您可以根据字段的 DataType 拥有自定义项目视图模型.

    然后你可以在你的视图上有一个使用模板选择器的列表,你可以根据DataTypeItemViewModel 创建Cell/Row,就是这样。

    然后你可以有一个类似的模型结构来填充值并将它们上传到服务器。

    希望它足够清楚

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2021-11-09
      • 2014-03-02
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多