【问题标题】:BackgroundColor Binding in MvvmCrossMvvmCross 中的 BackgroundColor 绑定
【发布时间】:2016-05-13 22:53:58
【问题描述】:

我正在尝试通过绑定 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);
    }
}

【问题讨论】:

  • 我认为您的转换器的方法签名被复制错误,因为它缺少类型参数并且应该无法编译。它应该类似于protected override MvxColor Convert(bool value, Type targetType, object parameter, CultureInfo culture)?并且转换器继承应该需要输出类型:MvxValueConverter&lt;bool, MvxColor&gt;?

标签: c# xamarin mvvmcross


【解决方案1】:

BackgroundColorColor pluign 的一部分。

第一步是确保您已安装它。

 Install-Package MvvmCross.Plugin.Color

然后从MvxColorValueConverter&lt;T&gt;继承你的转换器。

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)"

【讨论】:

    【解决方案2】:

    问题是MvxAppCompatSpinner (AppCompatSpinner properties) 上没有BackgroundColor 属性。

    您可以使用的备用属性是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:Error: 3.98 无法找到组合器或转换器 单背景值转换器

    工作

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

    旁注 - 建议

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

    【讨论】:

    • Target 上是否有属性无关紧要。 Mvvmcross 正在使用可以添加额外“虚拟”属性的 BindingTargets。在这种情况下,BackgroundColor 来自颜色插件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2013-10-17
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多