【问题标题】:MvvmCross Xamarin.Android FloatingActionButton toggle visibilityMvvmCross Xamarin.Android FloatingActionButton 切换可见性
【发布时间】:2017-10-11 20:04:48
【问题描述】:

这是我的 FloatingActionButton:

<android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_add_retailer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:tint="@android:color/white"
        app:backgroundTint="@color/colorPrimary"
        app:srcCompat="@drawable/ic_add_black_24dp"
        local:MvxBind="Visibility IsAddButtonVisible, Converter=Visibility" />

它的可见性属性通过 MvvmCross 绑定到 IsAddButtonVisible:

private bool _isAddButtonVisible = true;
public bool IsAddButtonVisible
{
    get
    {
        return _isAddButtonVisible;
    }
    set
    {
        _isAddButtonVisible = value;
        RaisePropertyChanged(() => IsAddButtonVisible);
    }
}

当我改变布尔值时

ViewModel.IsAddButtonVisible = false;

...什么也没发生。我在这里做错了什么?提前致谢!

编辑:当我使用 Visible 绑定时,切换有效

local:MvxBind="Visible IsAddButtonVisible"

但现在我在 FloatingActionButton 上看不到任何隐藏/显示动画...

【问题讨论】:

  • 您的输出中是否有任何内容“无法为绑定可见性创建目标绑定...”?你的链接器设置是什么?看到您使用的是 bool 类型,您宁愿使用 Visible Mvx 自定义绑定选项 local:MvxBind="Visible IsAddButtonVisible"
  • @Plac3Hold3r 谢谢!我在输出中什么也看不到,至少在我通常看到绑定错误的地方看不到。哦,当我使用 local:MvxBind="Visible IsAddButtonVisible" 时,切换工作:) 但我没有在按钮上看到通常的动画。它只是出现和消失。如果我手动调用 hide() 和 show() 我可以看到动画,所以我认为我已经正确设置了按钮。知道如何获得这些动画吗?
  • 有趣的是,Visible 绑定没有问题,但 Visibility 绑定中断时没有错误。出于好奇,您在构建时的链接器设置是什么?
  • @Plac3Hold3r 你是说我的 LinkerPleaseInclude 文件吗?我只是注意到我里面有东西,这是我实验的剩余物......public void Include(FloatingActionButton floatingActionButton) { floatingActionButton.Visibility = floatingActionButton.Visibility; }这显然行不通......
  • 这是你的cs proj中的一个设置。您可以在“属性”>“Android 选项”>“链接器(选项卡)”中看到它,然后在“链接”下拉列表中看到它。

标签: android xamarin data-binding xamarin.android mvvmcross


【解决方案1】:

您必须使用自定义绑定来使用方法调用而不是 Visibility ViewStates 更改。


根据您绑定到的布尔值创建处理执行显示和隐藏方法调用的目标绑定。

public class FloatingActionButtonAnimateVisibleTargetBinding
    : MvxAndroidTargetBinding
{
    protected FloatingActionButton View => (FloatingActionButton)Target;

    public FloatingActionButtonAnimateVisibleTargetBinding(FloatingActionButton target)
        : base(target)
    {
    }

    public override Type TargetType => typeof(bool);

    protected override void SetValueImpl(object target, object value)
    {
        var isVisible = value.ConvertToBoolean();
        var floatingActionButton = target as FloatingActionButton;

        if (isVisible)
            floatingActionButton.Show();
        else
            floatingActionButton.Hide();
    }

}

在您的平台注册自定义绑定Setup.cs

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
    base.FillTargetFactories(registry);

    registry.RegisterCustomBindingFactory<FloatingActionButton>(
        "VisibleAnim",
        button => new FloatingActionButtonAnimateVisibleTargetBinding(button));
}

那么你应该能够在你的 XML 中使用绑定

local:MvxBind="VisibleAnim IsAddButtonVisible"

【讨论】:

  • 太棒了,效果很好。我一直在研究自定义活页夹,但从昨天开始我才开始使用 MvvmCross,我还想不通 :)
  • 是的。这是 MvvmCross 的一个很酷的特性。开箱即用,它做了很多事情,但它也有钩子,允许您直接使用本机 API 做更高级的事情。
猜你喜欢
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多