首页 > 解决方案 > MVVMCross 为 viewmodel 添加多个动态属性

问题描述

我需要根据服务响应(而不是手动定义 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#xamarinmvvmcross

解决方案


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

一种是像你在那里那样使用反射,但你可能会遇到性能问题。

另一种方法是将您从服务器获得的数据和模型安排为您可以使用一些工厂来构建您的视图/虚拟机:

所以它可能是:

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在您的 VM 上拥有一个项目,并且您的项目可以通过工厂为结构的每个字段进行迭代创建,因此您可以根据字段的 DataType 拥有自定义项目视图模型。

然后你可以在你的视图上有一个使用模板选择器的列表,你可以在其中创建Cell/Row依赖于DataType或的ItemViewModel,那就是它。

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

希望它足够清楚


推荐阅读