对于 UIButton,我不相信Selected
MvvmCross 中内置了任何包含的绑定。正因为如此 - 因为Selected
没有简单的配对事件SelectedChanged
,所以我相信Selected
绑定应该单向工作(从 ViewModel 到 View)而不是双向工作。
有On
一个UISwitch
控件的绑定,这是我在这些情况下使用最多的控件。
如果您想添加自定义的 2-way 绑定,Selected
那么我猜您必须使用ValueChanged
事件来执行此操作(但需要检查是否正确)。
为此,您只需构建一个目标绑定,例如:
public class MvxUIButtonSelectedTargetBinding : MvxPropertyInfoTargetBinding<UIButton>
{
public MvxUIButtonSelectedTargetBinding(object target, PropertyInfo targetPropertyInfo)
: base(target, targetPropertyInfo)
{
var view = View;
view.ValueChanged += HandleValueChanged;
}
private void HandleValueChanged(object sender, System.EventArgs e)
{
var view = View;
if (view == null)
return;
FireValueChanged(view.Selected);
}
public override MvxBindingMode DefaultMode
{
get { return MvxBindingMode.TwoWay; }
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
if (isDisposing)
{
var view = View;
if (view != null)
{
view.ValueChanged -= HandleValueChanged;
}
}
}
}
这可以在安装程序中protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
使用类似的东西注册:
registry.RegisterPropertyInfoBindingFactory(typeof(MvxUIButtonSelectedTargetBinding), typeof(UIButton),
"Selected");
同样,我不相信有人已经添加了双向UISegmentedControl
绑定 - 但很高兴看到添加了一个。
构建双向UISegmentedControl
绑定将非常简单 - 您只需绑定到这对-SelectedSegment
和ValueChanged
- 使用与上面类似的代码。
或者,您可以切换到使用具有MySegmentedControl
更好的“ValueChanged”对的自定义,无需 Value
自定义绑定即可自动工作 - 例如:
public class MySegmentedControl : UISegmentedControl
{
// add more constructors if required
public int Value
{
get { return base.SelectedSegment; }
set { base.SelectedSegment = value; }
}
}
如果需要任何或所有这些自定义绑定,那么 Mvx 项目很乐意将这些绑定添加为问题或拉取请求以及https://github.com/slodge/MvvmCross-Tutorials/blob中的测试/演示 UI /master/ApiExamples/ApiExamples.Touch/Views/FirstView.cs项目