c# - 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 的最新版本创建的。请分享在可以与动态生成的视图元素(文本框和文本视图)绑定的视图模型中生成动态字符串(或对象类型)属性的方法。
谢谢
解决方案
有几种方法可以做到这一点。
一种是像你在那里那样使用反射,但你可能会遇到性能问题。
另一种方法是将您从服务器获得的数据和模型安排为您可以使用一些工厂来构建您的视图/虚拟机:
所以它可能是:
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
,那就是它。
然后你可以有一个类似的模型结构来填充值并将它们上传到服务器。
希望它足够清楚
推荐阅读
- python - function __eq__ 另一个函数给出 NotImplemented
- php - cURL Laravel 和 Aspx 端点
- node.js - 在 MongoDB 中聚合双嵌套数组的文档
- c# - checkip.dyndns.org 服务返回 LAN IP
- jquery - 使用 <输入> 的 jQuery UI 可排序位置
- python - Python - 重塑嵌套数组
- c# - 带有子路由的 ASP.NET MVC 路由,没有属性路由
- angular - Angular Material Datatable 未对来自 Http 请求的数据进行排序
- sql - 数据透视表获取多个值
- python - 如何识别带有队列的 Python 线程是否已完成任务?