MvvmCross对话框自定义UIViewElement数据绑定

时间:2014-09-11 19:13:04

标签: mvvmcross

我正在尝试为传递到UIViewElement的MvxView设置数据绑定代码,使用此Github Example Code作为基础

我有这个元素 -

public class WGMvxViewElement : UIViewElement, IBindableElement
{
    public IMvxBindingContext BindingContext { get; set; }

    public WGMvxViewElement(string caption, MvxView view, bool transparent)
        : base(caption, view, transparent)
    {
        this.CreateBindingContext();

        // Bind our DataContext to the DataContext of the supplied MvxView

        this.DelayBind(() => {

            view.DataContext = DataContext;

        });
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            BindingContext.ClearAllBindings();
        }
        base.Dispose(disposing);
    }

    public virtual object DataContext
    {
        get { return BindingContext.DataContext; }
        set { BindingContext.DataContext = value; }
    }
}

DelayBind中的当前代码是否会导致任何内存泄漏或问题?

我最初尝试使用Databinding来执行此操作而不是显式设置,但无法使语法工作/导致错误/循环

this.DelayBind(() => {
    this.CreateBinding().For(mvxve => mvxve.DataContext).To<SettingsProfileView>(v => v.DataContext).Apply();
    // think that was in reverse, so try?
    view.CreateBinding().For(v => v.DataContext).To<WGMvxViewElement>(ve => ve.DataContext);

任何人都可以纠正我,如果这是错误的或有适当的绑定代码,所以它的绑定一直下来?

然后我在对话框中执行此操作 -

public class SettingsView : MvxDialogViewController
{
    SettingsViewModel MyViewModel { get { return ViewModel as SettingsViewModel; } }

    public SettingsView() : base(UITableViewStyle.Plain, null, true)
    {
        MvxInlineBindingTarget<SettingsViewModel> bindings = this.CreateInlineBindingTarget<SettingsViewModel>();

        Root = new RootElement("Settings")
        {
            new Section("Section") {
                 new WGMvxViewElement("", new SettingsProfileView(), true).Bind(bindings, el => el.DataContext, vm => vm),  

    ...

然后,提供给WGMvxViewElement的视图将在其ctor中使用此类DataContext -

public SettingsProfileView ()
{
    ... profileUIImageView + View set up somehow

    this.DelayBind (() => {
        var set = this.CreateBindingSet<SettingsProfileView, SettingsViewModel>();
        set.Bind(profileUIImageView.Tap()).For(tap => tap.Command).To(vm => vm.ChooseProfileCommand);
        set.Apply(); 
    });
}

在撰写这个问题时,代码似乎运作正常,但是有经验的用户可以看到任何缺点或改进,比如我错过了某个地方。

0 个答案:

没有答案