MVVMCross добавить несколько динамических c свойств для модели представления - PullRequest
0 голосов
/ 18 марта 2020

У меня есть требование отображать экран (тип экрана: форма) динамически на основе ответа службы (а не определять пользовательский интерфейс вручную). Мне удалось успешно привязать предопределенные свойства к динамически создаваемым текстовым полям и текстовым представлениям. Ниже приведен пример кода, который использовался для привязки предопределенного свойства к текстовому полю Dynami c

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();

. Однако необходимо усовершенствовать код, динамически создавая количество свойств - динамически сопоставляя их с элементами пользовательского интерфейса. создано. Проект создан с использованием Xamarin. Android с последней версией MVVMCross. Пожалуйста, поделитесь способом генерации динамических c строковых (или тип объекта) свойств в моделях представления, которые могут быть связаны с динамически генерируемыми элементами представления (текстовые поля и текстовые представления).

Спасибо

1 Ответ

1 голос
/ 25 марта 2020

Есть несколько способов сделать это.

Один из них использует Reflection, как и вы, но у вас могут возникнуть проблемы с производительностью.

Другой способ - немного устроить данные и модель, которые вы получаете с сервера, могут быть чем-то похожим на то, что вы можете использовать на некоторых фабриках для создания вашей View / 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 на вашей виртуальной машине, и ваши элементы могут быть созданы фабрикой, повторяющейся для каждого из полей структуры, и поэтому вы можете иметь собственные модели представления элементов в зависимости от типа данных поля.

Тогда у вас может быть список в вашем представлении, в котором используется селектор шаблонов, в котором вы можете создать Cell/Row в зависимости от DataType или ItemViewModel, и это будет все.

Тогда вы можете иметь аналогичная структура модели для заполнения значений и загрузки их на сервер.

Надеюсь, это достаточно ясно

...