Visibility binding fails

2019-05-07 10:41发布

问题:

I try to use the Visibility plugin with the FieldBinding plugin with no luck.

Model side:

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

ViewModel side:

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

View side, first try:

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

Second try:

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

But same result:

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

I just took the birthdate as an example, but every Visibility bindings failed (I have x error messages for x bindings).


EDIT 1

The others binding work, I bind a bunch of text, and all display well:

      <TextView
         style="@style/TextView.ListWithIcon.Single"
         android:layout_marginTop="@dimen/ListIconTwoLineTextMarginTop"
         local:MvxBind="Text User.FirstName" />

I also try to bind to a INPC property, same result.


EDIT 2

As suggested by stuart, i tried this:

<TextView
    style="@style/TextView.ListWithIcon.Single"
    android:layout_marginTop="@dimen/ListIconTwoLineTextMarginTop"
    android:layout_marginLeft="@dimen/ListIconTextMarginLeft"
    local:MvxBind="Text Visibility(User.Birthdate)">

And the visibility converter on TextView seems to work, if Birthdate is null:

Birthdate:  Gone

But it does not seem to bind to the visibility property:

<TextView
    style="@style/TextView.ListWithIcon.SecondLine"
    android:layout_below="@+id/Birthday"
    local:MvxBind="Visibility Visibility(User.Birthdate)"
    android:text="Whatever birthdate" />

Displays "Whatever birthdate" whereas Visibility(User.Birthdate) returns Gone...


EDIT 3

If you use Visible pseudo-property everything works as expected.

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

回答1:

I had the same issue with a 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)">

Visibility of the LinearLayout wouldn't bind to my view model:

Failed to create target binding for binding Visibility for MvxValueConverterValueCombiner combiner-operation

Solution: add an entry to LinkerPleaseInclude.cs so the Visibility property isn't stripped from the view:

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


回答2:

There are 2 scenarios:

  1. If you use MvvmCross 5 and below you need to use:

a) local:MvxBind="Visibility Visibility(User.Birthdate)" in your view

b) add a VisibilityPluginBootstrap.cs file in you Bootstrap folder that would look like this:

 using MvvmCross.Platform.Plugins;

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

  1. If you use MvvmCross 6 and above you need to use only:

    local:MvxBind="Visible User.Birthdate" in your view

and don't need a Bootstrap file: