xamarin.android - 如何在 Android 布局元素中绑定(bind)多个属性

标签 xamarin.android mvvmcross

我正在使用 MvvmCross 将我的 ViewModel 数据绑定(bind)到 Android View 布局。

从 SimpleBinding 示例中我可以看到,要将值绑定(bind)到属性,我这样做:

  <EditText
    android:hint="Subtotal"
    android:gravity="left"
    android:inputType="numberDecimal"
    android:maxLines="1"
    android:numeric="decimal"        
    local:MvxBind="{'Text':{'Path':'SubTotal','Converter':'Float'}}"
  />

因此 Text 绑定(bind)到 ViewModel 的 SubTotal 属性。但如何绑定(bind)多个属性呢?就我而言,我想将名为 HigherLower 的 ViewModel 属性绑定(bind)到布局元素的 TextColor 属性。我无法添加另一个 MvxBind,也无法将 MvxBind 设置为数组。

最佳答案

绑定(bind)表达式中使用的 JSON 格式是名为 MvxJsonBindingDescription 的字典

public class MvxJsonBindingDescription
{
    public string Path { get; set; }
    public string Converter { get; set; }
    public string ConverterParameter { get; set; }
    public string FallbackValue { get; set; }
    public MvxBindingMode Mode { get; set; }
}

这与以下内容一起使用:

  • 字典键名称是绑定(bind)的目标( View )属性。
  • 绑定(bind) Path 属性是绑定(bind)的源 (DataContext) 属性 - 如果未指定 Path,则整个 DataContext 本身就是绑定(bind)源。

对于 Activity/View 级别的 axml,DataContext 是 ViewModel - 但对于 subview axml,DataContext 通常是 ViewModel 的子对象 - 例如在 ListView 中,DataContext 可能是 ViewModel 拥有的 List 或 ObservableCollection 中的一项。


要指定多个绑定(bind),您可以使用 JSON,例如:

 {
      'TargetProperty1':{'Path':'SourceProperty1'},
      'TargetProperty2':{'Path':'SourceProperty2'}
 }

对于您的特定示例,这可能是:

local:MvxBind="
       {
          'Text':{'Path':'SubTotal','Converter':'Float'}, 
          'TextColor':{'Path':'HigherLower','Converter':'MyColorConverter'}
       }"

你的 ViewModel 是这样的:

public class MyViewModel : IMvxViewModel
{
     public float SubTotal { get; set; }

     public bool HigherLower { get; set; }

     // more code here
}

你的转换器是这样的:

public class MyColorConverter : MvxBaseColorConverter
{
    protected override MvxColor Convert(object value, object parameter, CultureInfo culture)
    {
        return ((bool)value) ? new MvxColor(255,0,0) : new MvxColor(0,255,0);
    }
}

以及在设置过程中初始化转换器的位置 - 例如看看 Converters 的属性如何类用于 TwitterSearch


显示多重绑定(bind)工作的一个示例是 BestSellers - 请参阅列表项中的单击和文本绑定(bind) https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20BestSellers/BestSellers/BestSellers.Droid/Resources/Layout/ListItem_Category.axml

关于xamarin.android - 如何在 Android 布局元素中绑定(bind)多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688603/

相关文章:

Android 是使用 TableLayout 还是 GridView 更好

android - Xamarin Android ListView 的垂直滚动

mvvmcross - 如何使用 Mvvmcross 定位 .NET 4.0?

crash - Xamarin 安卓 : Application crashed after clear data in Settings

xamarin.android - 无法使用计时器、自定义 View 和 Xamarin 关闭 AlertDialog

xamarin.android - .NET 4.5 PCL 中的异步/等待面向 Android 的 Mono?

mvvm - 从另一个页面回来后重新初始化ViewModel

ios - Xamarin、MVVM交叉和崩溃报告

mvvm-light - 用 MvvmCross 替换 MVVM Light 或同时使用两者

c# - mvvmcross 与 xamarin.ios