我有一个视图,它使用几个MonoTouch.Dialog元素进行屏幕控制。我已经能够为除了一个ButtonElement之外的所有屏幕控件创建流畅的绑定,因为我无法访问其UIButton子视图的TouchUpInside事件。
这是创建控件,构建屏幕并创建绑定的伪代码。
// Controls created
CheckboxElement checkbox = new CheckboxElement("Lorem ipsum dolor");
StringElement string1 = new StringElement("Sit amet");
StringElement string2 = new StringElement("Consectetur");
ButtonElement button = new ButtonElement("Adipiscing", delegate{method();});
// Elements used to create view
List<Element> elements = new List<Element>(){checkbox, string1, string2, button};
AddElements(elements);
// Bind controls to view model properties
var set = this.CreateBindingSet<SettingsView, SettingsViewModel>();
set.Bind(checkbox).For(v => v.BooleanValue).To(vm => vm.CheckboxProperty).TwoWay();
set.Bind(string1).For(v => v.Value).To(vm => vm.String1Property);
set.Bind(string2).For(v => v.Value).To(vm => vm.String2Property);
// Binding to ButtonElement TouchUpInside event would go here
set.Apply();
将UIButton作为唯一子视图的ButtonElement,这是我要链接到视图模型中的ICommand方法的子视图的TouchUpInside事件。
public ICommand TouchUpInsideCommand()
{
get { ... }
}
现在在ButtonElement中,当在GetCell中创建UIButton时,其TouchUpInside事件链接到匿名委托方法,该方法作为ButtonElement的构造函数的一部分传入并存储在名为Tapped的NSAction中。
button.TouchUpInside += (o, e) => Tapped.Invoke();
要删除此事件处理,我创建了一个名为ButtonElementMvx的新类,它继承自ButtonElement。在ButtonElementMvx的GetCell方法中,我删除了由其父级设置的事件处理。
public ButtonElementMvx : ButtonElement
{
...
public override UITableViewCell GetCell(UITableView tv)
{
UITableViewCell cell = base.GetCell(tv);
button.TouchUpInside -= ButtonTouchUpInsideEventHandler;
return cell;
}
}
ButtonTouchUpInsideEventHandler是对ButtonElement的GetCell中创建的匿名委托方法的引用(我知道这个实现可能有点笨拙但我稍后会清理它。)
这是我的问题 - 在我创建其他绑定的视图中创建对ButtonElement的UIButton TouchUpInside事件的绑定的最佳方法是什么?
buttonElement : ButtonElement
|
-> uiButton : UIButton
|
-> TouchUpInside
的内容
set.Bind(buttonElement.uiButton).For("TouchUpInside").To(vm => vm.TouchUpInsideCommand);
我做了一些研究,我认为前进的方法是创建一个在启动时添加到注册表的自定义绑定(在Stuart的N=28 - Custom Binding视频中概述),以及将我的ButtonElementMvx类扩展为{{ 3}}我可以访问按钮的TouchUpInside事件并将其与我的其他控件一起绑定在我的视图中。
有什么想法?这是正确的方法,还是我朝错误的方向前进?