如何使用 mvvmcross + c# 在 xamarin android 中绑定 layout_margintop

How to bind layout_margintop in xamarin android using mvvmcross + c#

我想将 layout_marginTop 与模型值绑定。 我能够绑定文本和命令,但无法绑定 layout_marginTop。 例如,

mvvm:MvxBind="Text Title;layout_marginTop TopMargin"

提前致谢。

为此你需要 Custom data binding 因为 Mvx 默认没有边距顶部绑定。

创建目标绑定class:

public class MarginTopTargetBinding : MvxPropertyInfoTargetBinding
{
    public MarginTopTargetBinding(object target, PropertyInfo targetPropertyInfo) 
        : base(target, targetPropertyInfo)
    {
    }

    protected override void SetValueImpl(object target, object value)
    {
        var view = target as View;
        if (view == null)
            return;

        var marginParams = view.LayoutParameters as ViewGroup.MarginLayoutParams;
        if (marginParams == null)
            throw new InvalidOperationException("You can't set a margin to a View which Layoutparameters are not derived from MarginLayoutParams");

        marginParams.TopMargin = (int)value;

        view.LayoutParameters = marginParams;

        view.RequestLayout();
    }
}

然后您只需在 Setup.cs:

中注册它
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
    base.FillTargetFactories(registry);

    registry.RegisterPropertyInfoBindingFactory(
        typeof(MarginTopTargetBinding),
        typeof(View), "MarginTop");
}

并像这样使用它:

mvvm:MvxBind="Text Title; MarginTop TopMargin"

顺便说一下,您可以拥有一个更复杂的对象 MyCustomMarginModel,它具有 margin 的所有四个属性并为其执行自定义绑定,这样您就可以随时绑定每个 margin。