如何将UITableViewCell的子视图事件绑定到视图模型ICommand?

时间:2014-01-29 17:05:01

标签: data-binding xamarin.ios mvvmcross monotouch.dialog

我有一个视图,它使用几个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事件并将其与我的其他控件一起绑定在我的视图中。

有什么想法?这是正确的方法,还是我朝错误的方向前进?

0 个答案:

没有答案