2013-07-23 2 views
0

У меня есть ситуация, когда мое определение определения (то есть содержимое, которое отображается в файле макета) определяется в структуре json. Мне нужно определить эту структуру json вместе с привязками, а затем мой код должен иметь возможность динамически создавать элементы управления на основе структуры json и заполнять макет.Как визуализировать элементы управления, определенные в структуре Json, используя MvvmCross?

Я могу выполнить то же самое с использованием кода ниже.

protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     FirstViewModel firstViewModel = new FirstViewModel() 
     { 
      Id = 1001, 
      FirstName = "Amit", 
      MiddleName = string.Empty, 
      LastName = "Taparia", 
      Race = "Asian", 
      IsUSNational = false 
     }; 

     this.ViewModel = firstViewModel as IMvxViewModel; 
     var bindings = this.CreateInlineBindingTarget<FirstViewModel>();      

     this.Root = new RootElement("Main View", null, null). 
     { 
      new Section("Personal Information") 
      {           
       new StringElement("Employee#","Enter Employee#").Bind(bindings,vm => vm.Id) 
       new EntryElement("FirstName","Enter First Name").Bind(bindings,vm=>vm.FirstName), 
       new EntryElement("MiddleName","Enter Middle Name").Bind(bindings, vm=> vm.MiddleName), 
       new EntryElement("LastName","Enter Last Name","Amit",null).Bind(bindings, vm => vm.LastName), 
       new EntryElement("Race","Enter Race").Bind(bindings,vm => vm.Race), 
       new BooleanElement("US National",true,).Bind(bindings, vm => vm.IsUSNational).     
      },    
     }; 
    } 

Но мне нужно иметь возможность делать то же самое с использованием структуры, определенной в json-файле. Я знаю, что мы можем сделать что-то подобное с помощью MvvmCross, но я не знаю, как это сделать.

я наткнулся на эти три образца решения а) CustomerManagement б) CustomerManager.AutoView Здесь я вижу, что у нас есть BaseCustomerEditView.cs где Eсть структура JSON определена, но код закомментирована. с) DialogExamples

Пара вопросов

1) Что разница между использованием AutoView и MvxDialog? Это одно и то же?

2) Существуют ли потенциальные ограничения с использованием структуры управления, определенной в json-файле. Я вижу одну проблему, связанную с выравниванием. У нас не будет никакого контроля над выравниванием элементов управления, определенных в json-файле.

3) Как добиться рендеринга/связывания с использованием структуры, определенной в json-файле?

Ждем ваших ответов.

ответ

0

Dialog обеспечивает «основой для создания диалоговых окон и показать информацию на основе таблиц без необходимости писать десятки делегатов и контроллеров для пользовательского интерфейса» (от https://github.com/migueldeicaza/MonoTouch.Dialog)

Идея AutoViews является создание слоя авто-порожденных UIs построенных в основном в верхней части диалога, особенно для прототипирования, но и, возможно, для некоторых семейств приложений - см Should I wait for AutoView? и http://slodge.blogspot.co.uk/2012/10/cross-platform-views-for-mvvmcross-ideas.html

текущее состояние AutoViews что есть начальная реализация доступна на Android и прошивкой , и есть небольшой образец, который показывает использование этого осуществление на: https://github.com/slodge/MvvmCross-Tutorials/tree/master/AutoViewExamples

Основное внимание демо использует Auto объектов для описания пользовательского интерфейса в ViewModel - например:

private KeyedDescription GetDialogAutoView() 
    { 
     var auto = new RootAuto(caption: "Some Dialog Info") 
     { 
      new SectionAuto(header: "Strings") 
       { 
        new EntryAuto(caption: "Name", bindingExpression:() => Name), 
        new EntryAuto(caption: "Password", bindingExpression:() => Password) { Password = true }, 
       }, 
      new SectionAuto(header: "Booleans") 
       { 
        new BooleanAuto(caption: "Is available", bindingExpression:() => IsAvailable), 
        new CheckboxAuto(caption: "Is active", bindingExpression:() => IsActive), 
       }, 
      new SectionAuto(header: "DateTimes") 
       { 
        new DateAuto(caption: "Date of Birth", bindingExpression:() => DateOfBirth), 
        new TimeAuto(caption: "When", bindingExpression:() => PreferredContactTime), 
       }, 
      new SectionAuto(header: "Debug Info") 
       { 
        new StringAuto(caption: "Name", bindingExpression:() => Name), 
        new StringAuto(caption: "Password", bindingExpression:() => Password), 
        new StringAuto(caption: "Is available", bindingExpression:() => IsAvailable), 
        new StringAuto(caption: "Is active", bindingExpression:() => IsActive), 
        new StringAuto(caption: "Date of Birth", bindingExpression:() => DateOfBirth), 
        new StringAuto(caption: "When", bindingExpression:() => PreferredContactTime), 
       }, 
     }; 

     return auto.ToElementDescription(); 
    } 

Вместо этих Auto объектов, описание формата Json доступно, но не сегодня много документации. Некоторые файлы примеров существуют в https://github.com/slodge/MvvmCross-Tutorials/blob/master/Sample%20-%20CustomerManagement/CustomerManagement%20-%20AutoViews - например https://github.com/slodge/MvvmCross-Tutorials/blob/master/Sample%20-%20CustomerManagement/CustomerManagement%20-%20AutoViews/CustomerManagement.Droid/Assets/DefaultViews/NewCustomerViewModel/Dialog.json

Эти файлы Json очень основаны на отражении - они построены вокруг имен и свойств классов Dialog.

Для вашего конкретного случая, я думаю, я бы рекомендовал вам не использовать формат AutoViews Json.

Похоже, что у вас есть более конкретное требование - если вы хотите, чтобы ViewModels загружали Модели из Интернета и для ViewModels, чтобы затем создавать пользовательские интерфейсы из этих описаний.

Из-за этого я бы посоветовал вам начать с описания своих бизнес-моделей в C# POCOs - их можно легко сериализовать по сетевому соединению (например, с помощью Json.Net), и ваши ViewModels и Views могут затем определить, как для их отображения.

Как вы уже знаете из Is it possible to have method binding in mvvmcross using Fluent API?, вы можете привязать свой интерфейс к словарю или другой «динамической» структуре ViewModel, если хотите - я подозреваю, что это будет полезно при отображении и привязке данных динамической формы.

Возможно, вы можете использовать либо Auto, либо части JView в AutoViews как часть этого последнего этапа отображения, но я не думаю, что ваша сетевая передача должна быть выполнена с точки зрения элементов Dialog - придерживаться бизнеса объекты домена.

+0

Большое спасибо за руководство Стюарт. На самом деле мои требования еще более сложны и трудно объяснить здесь. Мне просто интересно, могу ли я отправить вам резюме того, что мы пытаемся выполнить, и может быть, если у вас есть время, вы можете нам помочь. Ours - это корпоративное приложение, и оно не так просто, как кто-то, определяющий элементы управления в файле макета и привязывающий его к модели представления. – Amit

+0

Моя компания может предложить консультации - см. Http://www.cirrious.com/2012/11/contact-us.html - но это не в полной мере относится к вопросам StackOverflow – Stuart

+0

Спасибо Stuart. Цените свой ответ. – Amit

Смежные вопросы