3

私はこのようなオブジェクト構造を持っています。

public class Model : MvxViewModel
{    
    private IDictionary<string, string> _properties;

    public IDictionary<string, string> Properties
    {
        get { return _properties; }
    }

    public string this[string key]
    {
        get { return Get(key); }
        set { Set(key, value); ;}
    }        

    public Model()
    {
        this._properties = new Dictionary<string, string>();
    }        

    public void Set(string propertyName, string value)
    {
        if (!_properties.ContainsKey(propertyName))
        {
            _properties[propertyName].Value = value;
        }
    }

    public string Get(string propertyName)
    {
        return _properties[propertyName];
    }               
}

Fluent API を使用して、このオブジェクトからコントロールに情報をバインドする必要があります。私のコントロールはコードで作成されます。

コードは次のようになります。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Hello);

    Model employeeModel = new Model();
    model["Id"] = 1000;
    model["FirstName"] = "Stuart";
    model["MiddleName"] = "";
    model["LastName"] = "Lodge";
    TableLayout containerLayout = this.FindViewById<TableLayout>(Resource.Id.containerLayout);
    if (containerLayout != null)
    {
        TableRow newRow = new TableRow(base.ApplicationContext);
        newRow.SetMinimumHeight(50);

        var txtFirstName = new EditText(ApplicationContext);
        txtFirstName.Hint = "First Name";

        var bindingSet = this.CreateBindingSet<HelloView, Model>();
        bindingSet.Bind(txtFirstName).For("Text").To(vm => vm.Get("FirstName"));
        bindingSet.Apply();

        newRow.AddView(txtFirstName);
        containerLayout.AddView(newRow);
    }

}

このようなことは可能ですか?

4

1 に答える 1

5

可能ですか...

はい、MvvmCross は非常に拡張性があるため、必要に応じてこれを追加できます。

それを行うには、次のことが必要です。

  • このスキームに何らかの名前を付けます - ここでは便宜上、Auto-ICommand バインディングに Method-Binding が既に使用されているため、Amit-Binding と呼びましょう - http://mvvmcross.wordpress.comの N=36 を参照してください
  • 仕様をもう少し完全に理解する - たとえば、変更が ViewModel からどのように公開されるかを明確にするだけです
  • Amit バインディングがバインディングの説明でどのように表示されるかを検討します。おそらく、それらをテキスト形式のバインディングでどのように表示するかを検討するのが最善です。
  • FluentBinding が Amit-Binding を含むバインディング記述を生成できるようにする 1 つ以上の拡張メソッドを提供します。これには、汎用パラメーター化されたメソッド呼び出しを使用して式を解析することが含まれます。
  • チベット バインディング パーサーとソース プロパティ パーサー クラスを拡張して、これらの Amit バインディングのテキスト形式を解析できるようにすることもできます (これらのクラスのテキスト バージョンに対して既に解析可能な形式を選択した場合、これは必要ない場合があります)。
  • これらの Amit-Source バインディングをいつ、どのように作成するかを知るソース プロパティ バインディング拡張ファクトリを提供します。

これは大変な作業のように聞こえるかもしれませんが、実際にはかなり実行可能です。INotifyChangedプラグインを使用してソース バインディングを追加する方法の例については、 https://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious/FieldBinding/Cirrious.MvvmCross.Plugins.FieldBindingを参照してください。 FluentBinding またはパーサーに新しい要件を追加することなく達成されます。


あるいは...

「通常のプロパティ」またはフィールド (FieldBinding プラグインを使用している場合) で文字列とインデクサーのバインディングを使用できます。

Touch と Droid の両方での例については、https://github.com/slodge/MvvmCross-Tutorials/tree/master/ApiExamplesの ObservableDictionary の例を参照してください。

  • Core プロジェクトには、 http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspxから再現された ObservableDictionary 実装が含まれています(通常の辞書は、動的更新が必要ない場合に使用されます)

  • Touch UI プロジェクトには、次の fluent バインディング ブロックが含まれています。

        var set = this.CreateBindingSet<ObservableDictionaryView, ObservableDictionaryViewModel>();
        set.Bind(label1).To(vm => vm.Items["One"]);
        set.Bind(label2).To(vm => vm.Items["Two"]);
        set.Bind(label3).To(vm => vm.Items["Three"]);
        set.Bind(all).To(vm => vm.ReplaceAllCommand);
        set.Bind(each).To(vm => vm.ReplaceEachCommand);
        set.Bind(makeNull).To(vm => vm.MakeNullCommand);
        set.Apply();
    
于 2013-07-23T02:48:21.690 に答える