2016-05-13 60 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'來自顏色插件。 –