2014-03-05 117 views
8

設置的LinearLayout的背景顏色,我試圖用一個MvxValueConverter設置基於一個布爾值的LinearLayout的背景色。該轉換器看起來是這樣的:通過布爾值

public class BackgroundColorValueConverter : MvxValueConverter<bool, MvxColor> 
{ 
    private static readonly MvxColor TrueBGColor = new MvxColor(0xDB, 0xFF, 0xCE); 
    private static readonly MvxColor FalseBGColor = new MvxColor(0xD6, 0xF6, 0xFF); 

    protected override MvxColor Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value ? TrueBGColor : FalseBGColor; 
    } 
} 

在我AXML佈局,我有以下代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    local:MvxBind="BackgroundColor MyBooleanValue, Converter=BackgroundColor"> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:textSize="18dp" 
     local:MvxBind="Text MyText" /> 
</LinearLayout> 

,我發現了以下錯誤:

Failed to create target binding for binding BackgroundColor for MyBooleanValue 

完整的錯誤跟蹤如下:

MvxBind:Error: 8.58 Problem seen during binding execution for binding BackgroundColor for MyBooleanValue - problem InvalidCastException: Cannot cast from source type to destination type. 
03-05 14:18:46.434 I/mono-stdout(16474): MvxBind:Error: 8.58 Problem seen during binding execution for binding BackgroundColor for MyBooleanValue - problem InvalidCastException: Cannot cast from source type to destination type. 
03-05 14:18:46.434 I/mono-stdout(16474):  at Cirrious.MvvmCross.Plugins.Color.Droid.BindingTargets.MvxViewBackgroundColorBinding.SetValueImpl (System.Object target, System.Object value) [0x00000] in <filename unknown>:0 
     at Cirrious.MvvmCross.Plugins.Color.Droid.BindingTargets.MvxViewBackgroundColorBinding.SetValueImpl (System.Object target, System.Object value) [0x00000] in <filename unknown>:0 
    at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0 
03-05 14:18:46.434 I/mono-stdout(16474): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0 
    at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (System.Object value) [0x00000] in <filename unknown>:0 

所以,我真的不知道從哪裏去。我試圖做什麼?我是否使用了正確的MvvmCross轉換器?任何指針將不勝感激。


更新:

更改轉換器:

public class BackgroundColorValueConverter : MvxColorValueConverter 
{ 
    private static readonly MvxColor TrueBGColor = new MvxColor(0xDB, 0xFF, 0xCE); 
    private static readonly MvxColor FalseBGColor = new MvxColor(0xD6, 0xF6, 0xFF); 

    protected override MvxColor Convert(object value, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (bool)value ? TrueBGColor : FalseBGColor; 
    } 
} 

...解決我的問題。我的LinearLayout上也有TextColor MyBooleanValue, Converter=TextColor,其功能與BackgroundColorValueConverter類似,我也遇到了關於未能創建目標綁定的相同錯誤。

有一次,我改變了我的AXML閱讀:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    local:MvxBind="BackgroundColor MyBooleanValue, Converter=BackgroundColor"> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:textSize="18dp" 
     local:MvxBind="Text MyText; TextColor MyBooleanValue, Converter=TextColor" /> 
</LinearLayout> 

......一切都按預期。對於任何偶然發生在未來的偶然事件:不要嘗試綁定上的TextColor,因爲它不起作用!

回答

3

還有的的BackgroundColor工作樣品中https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ValueConversion/ValueConversion.UI.Droid/Resources/Layout/View_Colors.axml

結合本品採用BACKGROUNDCOLOR從https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Color/Cirrious.MvvmCross.Plugins.Color.Droid/BindingTargets/MvxViewBackgroundColorBinding.cs

結合爲你做這項工作的樣本?

如果是的話,你能發現該樣本與您正在使用的一個區別? Color插件有問題嗎? (是否加載到你的UI項目?)這是LinearLayout與TextView的問題嗎?是否還有更多可以提供的錯誤跟蹤?您提供的一行跟蹤是在https://github.com/MvvmCross/MvvmCross/blob/1ec7bc5f0307595c7ae11f56727dd0e9d2a2262f/Cirrious/Cirrious.MvvmCross.Binding/Bindings/MvxFullBinding.cs#L139上創建的 - 但通常在該行之前有其他跟蹤。

如果不是,那麼這很令人擔心,因爲這意味着它是一個普通的bug ...


更新:(後提供更多信息)

我認爲這個問題是在你的ValueConverter - 與Android合作,您ValueConverter與本機類型來結束 - 而不是與平臺獨立MvxColor。您所看到的錯誤是一個無效的轉換異常 - 因爲綁定試圖投你MvxColorAndroid.Graphics.Colorhttps://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Color/Cirrious.MvvmCross.Plugins.Color.Droid/BindingTargets/MvxViewBackgroundColorBinding.cs#L25

要轉換到本機,可以使用MvxColorValueConverter基類 - 看到https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Color/Cirrious.MvvmCross.Plugins.Color/MvxColorValueConverter.cs

一個例子這是https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ValueConversion/ValueConversion.Core/Converters/Converters.cs#L35

public class ContrastColorConverter : MvxColorValueConverter 
{ 
    protected override MvxColor Convert(object value, object parameter, CultureInfo culture) 
    { 
     var input = (MvxColor) value; 
     var brightnessToUse = SimpleContrast(input.R, input.G, input.B); 
     return new MvxColor(brightnessToUse, brightnessToUse, brightnessToUse); 
    } 

    private static int SimpleContrast(params int[] value) 
    { 
     // this is only a very simple contrast method 
     // for more advanced methods you need to look at HSV-type approaches 

     int max = 0; 
     foreach (var v in value) 
     { 
      if (v > max) 
       max = v; 
     } 

     return 255 - max; 
    } 
} 

有上的顏色轉換器的一些文檔中https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters#wiki-the-mvx-color-valueconverters

+0

以下是我所假設的全部錯誤消息: http://pastebin.com/24vZpa67 –

+0

啊 - 我看到問題...將更新我的答案(也請編輯您的問題以包含錯誤跟蹤 - 它確實將幫助下一個人) – Stuart

+0

更新了問題,在此先感謝您的幫助! –

0

你對你的方法返回一個boolean值,其中它的期待MvxColor對象。

protected override MvxColor Convert(object value, object parameter, System.Globalization.CultureInfo culture) 
{ 
    (bool)value ? return TrueBGColor : return FalseBGColor; 
} 
+0

我我更新了我的問題。我不認爲這是問題,但它會根據value的值返回TrueBGColor或FalseBGColor。 –

0

面臨着同樣的錯誤關於「無法創建目標結合...」,乾脆搬到從文件夾中的核心-PCL項目下的轉換器下的Droid項目的新文件夾的伎倆對我來說:)