Да, так вы говорите, что это сработает, и вы можете использовать их повторно, но примите во внимание, что из-за axml вы не сможете изменить привязки, которые у вас есть. Так что если у вас есть ViewModel, которую вы также используете повторно, у вас нет проблем.
В случае, если вы хотите изменить привязки элемента управления, вам нужно создать элемент управления (.cs), в котором вы программно добавляете внутренние представления или раздуваете свой аксел, выполняете логику и имеете свойства для привязки, чтобы Вы можете использовать этот элемент управления и связать его.
например:.
[Register("myNamespace.SwitchRightText")]
public class SwitchRightText : LinearLayout
{
public SwitchRightText(Context context, IAttributeSet attrs, int defStyleAttr)
: base(context, attrs, defStyleAttr)
{
this.Init(context, attrs, defStyleAttr);
}
public SwitchRightText(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes)
: base(context, attrs, defStyleAttr, defStyleRes)
{
this.Init(context, attrs, defStyleAttr, defStyleRes);
}
public SwitchRightText(Context context, IAttributeSet attrs)
: base(context, attrs)
{
this.Init(context, attrs);
}
public SwitchRightText(Context context)
: base(context)
{
this.Init(context);
}
public SwitchRightText(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
// Controls
public SwitchCompat Switch { get; set; }
public TextView TextView { get; set; }
private bool _toggleBackgrond;
public bool ToggleBackground
{
get => this._toggleBackgrond;
set
{
this._toggleBackgrond = value;
this.UpdateBackground();
}
}
// Methods
private void Init(Context context = null, IAttributeSet attrs = null, int defStyleAttr = 0, int defStyleRes = 0)
{
if(IsInEditMode)
return;
this.Orientation = Orientation.Horizontal;
this.InitializeSwitch(context, attrs);
this.InitializeTextView(context, attrs);
this.AddView(this.Switch);
this.AddView(this.TextView);
}
private void InitializeSwitch(Context context, IAttributeSet attrs = null)
{
this.Switch = new SwitchCompat(context, attrs);
this.Switch.ShowText = false;
}
private void InitializeTextView(Context context, IAttributeSet attrs = null)
{
this.TextView = new TextView(context, attrs);
}
private void UpdateBackground()
{
this.SetBackgroundColor(this.ToggleBackground ? Android.Graphics.Color.Black : Android.Graphics.Color.Yellow);
this.Invalidate();
}
}
Вам может понадобиться пользовательская привязка, например,
public class TextSwitchRightTextTargetBinding : MvxAndroidTargetBinding
{
public TextSwitchRightTextTargetBinding(SwitchRightText switchRightText)
: base(switchRightText)
{
}
private SwitchRightText SwitchRightText => (SwitchRightText)this.Target;
protected override void SetValueImpl(object target, object value)
{
this.SwitchRightText.TextView.Text = (string)value;
}
public override Type TargetType => typeof(string);
public override MvxBindingMode DefaultMode => MvxBindingMode.TwoWay;
public override void SubscribeToEvents()
{
base.SubscribeToEvents();
this.SwitchRightText.TextView.TextChanged += TextView_TextChanged;
}
private void TextView_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
{
this.FireValueChanged(this.SwitchRightText.TextView.Text);
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
if(isDisposing)
this.SwitchRightText.TextView.TextChanged -= TextView_TextChanged;
}
}
И зарегистрируйте его в настройках:
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
base.FillTargetFactories(registry);
registry.RegisterFactory(new MvxCustomBindingFactory<SwitchRightText>("Text", srt => new TextSwitchRightTextTargetBinding(srt)));
}
Тогда в вашем .axml вы можете использовать его как:
<myNamespace.SwitchRightText
...
mvxBind="Text MyTextInMyViewModel; ToggleBackground ToggleBackgroundInMyVM" />
В iOS вы можете сделать пользовательский UIViewController
или пользовательский UIView
, добавить его туда, где вы хотите его использовать, и выполнить привязки.
Другой способ - создать общий проект и выполнить всю логику компонента там
FFImageLoading делает это в элементе управления MvxCachedImageView
Выдержка из кода
#if __IOS__
[Preserve(AllMembers = true)]
[Register("MvxCachedImageView")]
#elif __ANDROID__
[Preserve(AllMembers = true)]
[Register("ffimageloading.cross.MvxCachedImageView")]
#endif
/// <summary>
/// MvxCachedImageView by Daniel Luberda
/// </summary>
public class MvxCachedImageView
#if __IOS__
: UIImageView, ICachedImageView, INotifyPropertyChanged
#elif __ANDROID__
: ImageViewAsync, ICachedImageView, INotifyPropertyChanged
#endif