如何使用 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。
高
我想将 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。
高