2014-01-11 38 views
2

我正在使用MvvmCross和Xamarin.Android。我安裝了可見性插件。在我的Android應用程序的項目,我創建了支持隱形狀態(圖中未示出,但仍佔據佈局空間)的Android相關的可視性轉換器:未調用MvvmCross,特定於平臺的值轉換器

public class VisibleOrInvisibleValueConverter 
    : MvxValueConverter<bool, ViewStates> 
{ 
    public ViewStates Convert(bool value, Type targetType, CultureInfo cultureInfo, object parameter) 
    { 
    MvxTrace.Error("VisibleOrInvisibleValueConverter.Convert"); 
    return value ? ViewStates.Visible : ViewStates.Invisible; 
    } 
} 

在我.axml的標記,我用這個轉換器像這樣:

<FrameLayout 
     android:layout_width="0dip" 
     android:layout_height="5dip" 
     android:layout_weight="1" 
     android:background="#ff0000" 
     local:MvxBind="Visibility Selected, Converter=VisibleOrInvisible, FallbackValue=0" /> 

設在https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters#referencing-value-converters-in-touch-and-droid的文件上,我相信MvvmCross會自動發現這個值轉換器的存在,因爲它是我的UI項目。

在運行時,無論Selected的值是什麼,綁定值總是具有回退值。根據https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters#referencing-value-converters-in-touch-and-droid的文檔,這意味着我的綁定源路徑丟失,或值轉換器引發異常。

不幸的是,我認爲我可以統治這兩者。對於第一種可能性,我嘗試用庫存MvvmCross Visibility轉換器替換我的自定義VisibleOrInvisible轉換器,並且它工作正常。 (也就是說,綁定工作正常,但股票可見性轉換器不支持我想要的行爲,但無論如何,我認爲這表明源路徑(Selected)確實存在。

對於第二種可能性,我在VisibleOrInvisible轉換器的Convert函數中設置了一個斷點,它永遠不會執行。我還在那裏添加了一個MvxTrace調用,並且我從來沒有看到跟蹤消息。

雖然我的轉換器應該可以自動發現,我自己也嘗試顯式的增加我的具體平臺組裝到通過重寫Setup.cs的ValueConverterAssemblies屬性getter實現價值轉換器組件列表:

protected override List<Assembly> ValueConverterAssemblies 
{ 
    get 
    { 
    var toReturn = base.ValueConverterAssemblies; 
    toReturn.Add(typeof (VisibleOrInvisibleValueConverter).Assembly); 
    return toReturn; 
    } 
} 

但這沒有幫助。

我認爲MvvmCross發現我的轉換器OK。如果我有意在我的.axml文件中引用不存在的轉換器,我會在運行時的調試跟蹤中看到異常消息。但是,當我指定我的VisibleOrInvisible轉換器時,這些消息不會出現。

我的工作理論是,在執行轉換器的代碼的唯一代碼行之前,在調用我的轉換器的過程中發生異常。但我不知道如何去做到底。調試跟蹤中不會出現異常消息。

是不是有一個簡單的步驟,我錯了?我非常仔細地研究了MvvmCross ValueConversion示例,並且我認爲我正在做所有示例。

回答

5

我剛剛採取了ValueConversion示例,將核心csproj文件升級到配置文件158,然後插入您的值轉換器。

此轉換器被拾起罰款 - 我可以看到它在利用轉換列表:

protected override void InitializeLastChance() 
    { 
     base.InitializeLastChance(); 

     var registry = Mvx.Resolve<IMvxValueConverterLookup>(); 
     var f = registry.Find("VisibleOrInvisible"); 
     Mvx.Trace ("Custom converter was found : {0}", f != null); 
    } 

然而,當我試圖使用它,我看到了有關枚舉/布爾/值類型映射綁定錯誤..所以我可以看到有一些問題...


一個小挖之後,似乎這個問題的原因是因爲你的ValueConverter實現的,而不是重寫基類Convert方法的不同尋常的public ViewStates Convert方法。爲了解決這個問題,我改變了轉換器:

public class VisibleOrInvisibleValueConverter 
    : MvxValueConverter<bool, ViewStates> 
{ 
    protected override ViewStates Convert (bool value, Type targetType, object parameter, CultureInfo culture) 
    { 
     MvxTrace.Error("VisibleOrInvisibleValueConverter.Convert"); 
     return value ? ViewStates.Visible : ViewStates.Invisible; 
    } 
} 

更多關於使用MvxValueConverter<...>幫手,看https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters#using-the-mvxvalueconverter-helper(如果有具有錯誤樣本,然後「對不起」和其他一些樣品或某個文檔編輯值轉換器,請指出來誰擁有它,使他們能夠解決它)

此外,您可能會發現源MvxValueConverter有用 - 它希望非常直截了當遵循它如何實現IMvxValueConverterhttps://github.com/MvvmCross/MvvmCross/blob/v3.1/CrossCore/Cirrious.CrossCore/Converters/MvxValueConverter.cs


解決了這個問題後,這個問題提出的下一個挑戰是如何使用FallbackValue。我還沒有全面分析我從這個問題看到痕跡,但我沒有實驗一些其他FallbackValue語法的例子 - 這些似乎都正常工作:

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="200dp" 
    android:background="#ff0000" 
    local:MvxBind="Visibility VisibleOrInvisible(ThisWillNotBeFound), FallbackValue=Visible"  /> 


<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="200dp" 
    android:background="#ff0000" 
    local:MvxBind="Visibility VisibleOrInvisible(ThisWillNotBeFound), FallbackValue=Invisible"  /> 


<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="200dp" 
    android:background="#ffff00" 
    local:MvxBind="Visibility VisibleOrInvisible(ThisWillNotBeFound, FallbackValue=true)" /> 

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="200dp" 
    android:background="#0000ff" 
    local:MvxBind="Visibility VisibleOrInvisible(ThisWillNotBeFound, FallbackValue=false)" /> 

我不知道,如果數值回落值目前正在爲此案件工作 - 懷疑它需要更多調查(將記錄爲潛在問題)。

+0

哇,這是驚人的如何可以是盲目的事情。我必須從任何地方塊複製我的非覆蓋,不同參數順序Convert函數,但它不是來自任何您的示例。這確實解決了我的問題,謝謝。 .axml中的整數後備值來自之前的實驗,我試圖將非枚舉類型用作轉換器的目標類型。我的意思是它是無形的價值。 –

相關問題