MvvmCross,特定于平台的值转换器未被调用

蒂姆·克鲁斯

我在Xamarin.Android中使用MvvmCross。我已安装了可见性插件。在我的Android应用程序项目中,我创建了一个特定于Android的可见性转换器,该转换器支持Invisible状态(视图未显示,但仍占用布局空间):

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转换器,并且效果很好。(也就是说,绑定工作正常。但是,股票可见性转换器不支持我想要的行为。)无论如何,我认为这表明源路径(已选择)确实存在。

对于第二种可能性,我在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正在发现我的转换器,确定。如果我有意在我的.axml文件中引用了不存在的转换器,则在运行时,我会在调试跟踪中看到异常消息。但是,当我指定VisibleOrInvisible转换器时,这些消息不会出现。

我的工作原理是,一个例外是发生在我的调用转换器的过程中,代码的唯一行之前执行转换。但是我不知道该怎么做。在调试跟踪中没有异常消息出现。

我犯错了一个简单的步骤吗?我已经非常仔细地研究了MvvmCross ValueConversion示例,并且我认为我正在做该示例所做的所有事情。

斯图尔特

我刚刚获取了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实现了一个不寻常的public ViewStates Convert方法,而不是覆盖了基类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)" />

我不确定目前的数字后备值是否适用于这种情况-怀疑它需要更多调查(将记录为潜在问题)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档