我正在尝试使用如下绑定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);
}
}
答案 0 :(得分:10)
BackgroundColor
是Color 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)
问题是BackgroundColor
(AppCompatSpinner 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中有一些额外的逻辑,或者如果您不想引发更改的事件。