可见性绑定失败。

4

我尝试使用Visibility插件和FieldBinding插件,但没有成功。

模型端:

    /// <summary>
    /// Gets or sets the birthdate.
    /// </summary>
    /// <value>
    /// The birthdate.
    /// </value>
    public DateTime? Birthdate { get; set; }

ViewModel 方面:

public class DisplayUserViewModel : BaseUserViewModel
{
    /// <summary>
    /// The user
    /// </summary>
    public readonly INC<User> User = new NC<User>();
}

视图方面,首次尝试:

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="@dimen/ListIconTwoLineTileHeight"
            android:paddingRight="@dimen/ListIconTwoLineTextMarginRight"
            local:MvxBind="Visibility User.Birthdate, Converter=Visibility">

第二次尝试:
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="@dimen/ListIconTwoLineTileHeight"
            android:paddingRight="@dimen/ListIconTwoLineTextMarginRight"
            local:MvxBind="Visibility Visibility(User.Birthdate)">

但是结果相同:

MvxBind ( 2574):  33.60 Failed to create target binding for binding Visibility for MvxValueConverterValueCombiner combiner-operation

我只是以生日为例,但所有可见性绑定都失败了(对于每个绑定,我有 x 个错误消息)。
编辑1 其他绑定有效,我绑定了一大堆文本,所有内容都显示正常:
      <TextView
         style="@style/TextView.ListWithIcon.Single"
         android:layout_marginTop="@dimen/ListIconTwoLineTextMarginTop"
         local:MvxBind="Text User.FirstName" />

我也尝试绑定到一个INPC属性,结果相同。
编辑 2 正如stuart所建议的,我尝试了以下内容:
<TextView
    style="@style/TextView.ListWithIcon.Single"
    android:layout_marginTop="@dimen/ListIconTwoLineTextMarginTop"
    android:layout_marginLeft="@dimen/ListIconTextMarginLeft"
    local:MvxBind="Text Visibility(User.Birthdate)">

如果Birthdate为空,那么TextView上的可见性转换器似乎起作用:

Birthdate:  Gone

但它似乎不绑定到可见性属性:
<TextView
    style="@style/TextView.ListWithIcon.SecondLine"
    android:layout_below="@+id/Birthday"
    local:MvxBind="Visibility Visibility(User.Birthdate)"
    android:text="Whatever birthdate" />

当Visibility(User.Birthdate)返回Gone时,显示“无论出生日期如何”...


编辑3

如果使用Visible伪属性,一切都按预期工作。

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="@dimen/ListIconTwoLineTileHeight"
            android:paddingRight="@dimen/ListIconTwoLineTextMarginRight"
            local:MvxBind="Visible User.Birthdate">

这里无法从内容中评论。还有其他错误消息或警告吗?你得到的是来自https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Cirrious/Cirrious.MvvmCross.Binding/Bindings/MvxFullBinding.cs#L139,但我期望/希望有更多。一些尝试实验:如果使用INPC而不是Visibility,绑定是否有效?如果您绑定到测试TextView中的Text属性(例如),绑定是否有效?最好在编辑问题时回答 - 在评论中回答更难阅读... - Stuart
很不幸,我只有上面的错误(还有一个被编辑过)。是否有选项可以获得更详细的日志? - Roubachof
如果您使用INPC,绑定是否有效?如果您绑定到TextView中的Text属性(例如,如果您绑定到测试TextView中的Text),绑定是否有效?也许尝试逐个更改一件事情 - 即如果您将TextView更改为<TextView style =“@style/TextView.ListWithIcon.Single”android:layout_marginTop =“@dimen/ListIconTwoLineTextMarginTop”local:MvxBind =“Text Visibility(User.Birthdate)”/>,然后local:MvxBind =“Text User.Birthdate”,那么这可能会给您一些线索 - 是INC、Visibilty、DateTime?还是其他什么问题... - Stuart
我再次尝试并在我的问题中添加了第二个编辑。 - Roubachof
在这种情况下,我没有真正的想法 - 看起来值转换器正在工作。您是否尝试过 https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ValueConversion/ValueConversion.UI.Droid/Resources/Layout/View_Visibility.axml 中的示例?如果您切换到使用 mvxBind="Visible User.Birthdate" 的绑定,它是否有效? - Stuart
2个回答

4

我曾经遇到过一个LinearLayout的问题:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:background="@color/white"
    local:MvxBind="Visibility Visibility(IsLoading)">

LinearLayout的可见性无法绑定到我的视图模型:

创建MvxValueConverterValueCombiner组合操作的目标绑定时,绑定可见性失败

解决方案:在LinkerPleaseInclude.cs中添加一个条目,以便从视图中删除Visibility属性:

public void Include(LinearLayout layout)
{
    layout.Click += (s, e) => layout.Visibility = layout.Visibility - 1;
}

是的!我怀疑会有这种问题,但我没想到是属性本身。 - Roubachof

1

有两种情况:

  1. 如果您使用的是MvvmCross 5及以下版本,则需要使用:

a) 在您的视图中使用local:MvxBind="Visibility Visibility(User.Birthdate)"

b) 在您的启动文件夹中添加一个名为VisibilityPluginBootstrap.cs的文件,其内容如下:

 using MvvmCross.Platform.Plugins;
    
    namespace YourNameSpace.Droid.Bootstrap
    {
        public class VisibilityPluginBootstrap
            : MvxPluginBootstrapAction<MvvmCross.Plugins.Visibility.PluginLoader>
        {
        }
    }

enter image description here

  1. 如果您使用的是MvvmCross 6及以上版本,则只需要在视图中使用以下内容:local:MvxBind="Visible User.Birthdate"

无需Bootstrap文件:


谢谢您的回答,我曾经在早期版本中使用过Visibility插件,当时语法是这样的 -> local:MvxBind="Visibility ActiveTab==1, Converter=Visibility"。这个插件确实可以使用Visible,但我想知道如何在MvvmCross 6+中使用InvertedVisibility转换器和语法。 - ozapa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接