平台项目中的价值转换器

时间:2013-09-25 17:47:25

标签: c# mvvmcross

我想为android创建一个经典的BooleanToVisibilityConverter,我遵循这个https://github.com/slodge/NPlus1DaysOfMvvmCross/tree/master/N-04-ValueConverters,但在这个示例中,所有转换器都在Core项目中。我在Droid项目中创建我的转换器并不起作用。

我的ValueConverter代码:

public class BoolToVisibilityValueConverter : MvxValueConverter<bool, ViewStates>
    {
        protected override ViewStates Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == true)
            {
                return ViewStates.Visible;
            }
            else
            {
                return ViewStates.Gone;
            }
        }

        protected override bool ConvertBack(ViewStates value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == ViewStates.Gone)
            {
                return false;
            }
            else if (value == ViewStates.Invisible)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }

我使用此转换器的布局。

<?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:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        local:MvxBind="Text Message" />
    <ProgressBar
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:indeterminate="true"
        android:layout_gravity="bottom|center_horizontal"
        local:MvxBind="Visibility ProgressBarVisibility,Converter=BoolToVisibility" />
</LinearLayout>

谢谢!

编辑:

调试跟踪。

09-26 16:11:34.300 I / mono-stdout(18362):参数名称:值 09-26 16:11:34.300 I / mono-stdout(18362):at(包装器托管到本机)System.Enum:ToObject(System.Type,object) [0:] MvxBind:错误:99.25在可见性的绑定执行期间出现问题 - 问题ArgumentException:传入的值必须是枚举基础或枚举的基础类型,例如Int32。 参数名称:value       at(包装器托管到本机)System.Enum:ToObject(System.Type,object)   在Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue(System.Type propertyType,System.Object value)[0x00000] in:0   在Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue(System.Object value)[0x00000] in:0   在Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue(System.Object value)[0x00000] in:0   在Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource(Boolean isAvailable,System.Object value)[0x00000] in:0 09-26 16:11:34.300 I / mono-stdout(18362):在Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue(System.Type propertyType,System.Object value)[0x00000] in:0 09-26 16:11:34.300 I / mono-stdout(18362):在Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue(System.Object value)[0x00000] in:0 09-26 16:11:34.300 I / mono-stdout(18362):在Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue(System.Object value)[0x00000] in:0 09-26 16:11:34.300 I / mono-stdout(18362):在Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource(Boolean isAvailable,System.Object value)[0x00000] in:0 El programa'Mono'terminóconcódigo0(0x0)。

1 个答案:

答案 0 :(得分:3)

您需要通过覆盖ValueConverterSetup.cs文件中注册ValueConverterAssemblies

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

您可以在此处详细了解:https://github.com/slodge/MvvmCross/wiki/Value-Converters#referencing-value-converters-in-touch-and-droid