2016-05-13 81 views
2

我试图改变绑定BackgroundColor属性的微调框的背景颜色,如下所示,但它没有任何效果。MvvmCross中的背景颜色绑定

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); 
    } 
} 
+1

我认为您的转换器的方法签名被复制错误,因为它缺少类型参数,应该无法编译。它应该像'保护覆盖MvxColor转换(布尔值,类型targetType,对象参数,CultureInfo文化)'?而转换器继承应该需要输出类型:'MvxValueConverter '? – Plac3Hold3r

回答

9

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

的问题是没有BackgroundColor财产上MvxAppCompatSpinnerAppCompatSpinner properties)。

您可以使用的备用属性是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)" /> 

你会看到一个错误信息的输出中/ logcat的如:

MvxBind:Error: 3.98 Failed to find combiner or converter for SingleBackgroundValueConverter

工作

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

旁注 - 建议

在您的视图模型示例代码Save()方法,则需要分配_isSingleValid支持字段,然后手动升高变化RaisePropertyChanged(() => IsSingleValid);。您可以通过直接将属性IsSingleValid = false;作为属性的集合执行RaisePropertyChanged(() => IsSingleValid);来简化此代码。唯一需要分配到支持字段的时间应该是如果在更新属性时不想运行setter中的某些其他逻辑,或者您不想引发更改的事件。

+1

目标上是否有财产并不重要。 Mvvmcross正在使用BindingTargets,可以添加额外的“虚拟”属性。在这种情况下'BackgroundColor'来自颜色插件。 –