MvvmCross中的BackgroundColor绑定

时间:2016-05-13 22:53:59

标签: c# xamarin mvvmcross

我正在尝试使用如下绑定BackgroundColor属性来更改微调器的背景颜色,但它没有效果。

View.axml

<mvvmcross.droid.support.v7.appcompat.widget.MvxAppCompatSpinner
    android:layout_width="115dp"
    android:layout_height="match_parent"
    android:textColor="@color/primary_text"
    local:MvxItemTemplate="@layout/single"
    local:MvxBind="ItemsSource SingleList; SelectedItem SingleSize ; BackgroundColor SingleBackgroundValueConverter(IsSingleValid)" />

Converter.cs

public class SingleBackgroundValueConverter: MvxValueConverter<bool>
{
  protected override MvxColor Convert(bool value, object parameter, CultureInfo culture)
  {
    // either white or red
    return value ? new MvxColor(255, 255, 255) : new MvxColor(255, 0, 0);
  }
}

在下文中,我能够看到警告弹出,但背景颜色根本没有变化。

ViewModel.cs

public void Save()
{
    if (!isExist)
    {
         OnExit(this, null);
    }
    else
    {
        _isSingleValid= false;
        RaisePropertyChanged(() => IsSingleValid);
        Mvx.Resolve<IUserDialogs>().Alert("It is not valid");
    }
}

private bool _isSingleValid = true;
public bool IsSingleValid
{
    get { return _isSingleValid; }
    set
    {
        _isSingleValid= value;
        RaisePropertyChanged(() => IsSingleValid);
    }
}

2 个答案:

答案 0 :(得分:10)

BackgroundColorColor pluign

的一部分

第一步是确保已安装它。

 Install-Package MvvmCross.Plugin.Color

然后从MvxColorValueConverter<T>继承你的转换器。

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

然后你必须在绑定中更改你的转换器名称,因为mvvmcross命名约定剥离了ValueConverter部分。

local:MvxBind="ItemsSource SingleList; SelectedItem SingleSize ; BackgroundColor SingleBackground(IsSingleValid)"

答案 1 :(得分:2)

问题是BackgroundColorAppCompatSpinner properties)上没有MvxAppCompatSpinner属性。

您可以使用的替代属性是Background。但是,Background需要Android.Graphics.Drawables.Drawable而不是Android.Graphics.Color

因此,您需要专门为Android平台创建一个转换器,以返回Android.Graphics.Drawables.ColorDrawable

public class SingleBackgroundValueConverter : MvxValueConverter<bool, ColorDrawable>
{
    protected override ColorDrawable Convert(bool value, System.Type targetType, object parameter, CultureInfo culture)
    {
        return value ? new ColorDrawable(new Color(255, 255, 255)) : new ColorDrawable(new Color(255, 0, 0));
    }
}

然后在你的布局中:

<mvvmcross.droid.support.v7.appcompat.widget.MvxAppCompatSpinner
  android:layout_width="115dp"
  android:layout_height="match_parent"
  android:textColor="@color/primary_text"
  local:MvxItemTemplate="@layout/single"
  local:MvxBind="ItemsSource SingleList; SelectedItem SingleSize ; Background SingleBackground(IsSingleValid)" />

注意 - 使用MvxValueConverter

在XML / AXML中使用MvxValueConverter时,必须确保不要包含转换器名称的“ValueConverter”部分:

<强> 错误

local:MvxBind="ItemsSource SingleList; Background SingleBackgroundValueConverter(IsSingleValid)" />

您将在ouput / logcat中看到错误消息,例如:

  

MvxBind:错误:3.98无法找到合并器或转换器   SingleBackgroundValueConverter

<强> 工作

local:MvxBind="ItemsSource SingleList; Background SingleBackground(IsSingleValid)" />

旁注 - 建议

在ViewModel示例代码Save()方法中,您要分配_isSingleValid支持字段,然后手动提升更改RaisePropertyChanged(() => IsSingleValid);。您可以直接分配属性IsSingleValid = false;来简化此代码,因为属性集将执行RaisePropertyChanged(() => IsSingleValid);。您需要分配到支持字段的唯一时间应该是在更新属性时您不想运行的setter中有一些额外的逻辑,或者如果您不想引发更改的事件。