使用vnext在Android中以编程方式添加额外绑定

时间:2013-09-30 13:51:41

标签: mvvmcross

我现在正在使用mvvmcross vnext。 我在布局中绑定了一个listitem,如下所示:

<TextView
        android:id="@+id/item_text"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:textAppearance="?android:attr/textAppearanceMedium"
        local:MvxBind="{'Text':{'Path':'Item.Name'}}" />

<TextView
        android:id="@+id/item_state_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right|center_vertical"
        android:textAppearance="?android:attr/textAppearanceMedium" />

我想要做的是在视图item_state_text上动态设置绑定。像这样:

if (<some_condition>) 
                myBinding = "{'Text':{'Path':'Item.LegacyStuff'}}";
TextView stateText = mvxBindableListItemView.FindViewById(Resource.Id.item_state_text) as TextView;
// create binding
            this.GetService<IMvxBinder>().Bind(this.ViewModel, stateText , myBinding );

我怎样才能实现

由于

1 个答案:

答案 0 :(得分:2)

通常我不会这样做 - 我不会有条件地添加绑定,特别是在ListItemViews的情况下,因为这些绑定会在列表中重复使用,并且很难确定绑定是否已经应用。< / p>

相反,我会使用:

  • 显示/隐藏条件视图的可见性绑定
  • 或者我使用ValueConverter进行条件文本转换。
  • 或者我使用自定义适配器来显示取决于条件决定的不同“单元格”。

话虽如此,如果你想在每个单元格中使用代码隐藏生成条件绑定,并且你想继续使用vNext,那么你可以使用类似的代码来实现:

var binder = this.GetService<IMvxBinder>();
var binding = binder.Bind(source, stateText, "{'Text':{'Path':'Item.LegacyStuff'}}").First();
BindingActivity.RegisterBinding(binding);

在v3中,此语法更容易,您可以使用FluentBinding语法生成绑定 - https://github.com/slodge/MvvmCross/wiki/Databinding#fluent