使用Xamarin.iOS和MvvmCross绑定到MvxView的问题

时间:2019-06-10 17:52:06

标签: xamarin.ios mvvmcross

我在使用Xamarin.iOS和MvvmCross(6.2.3.0)实现以下方案时遇到问题。我有一个视图,在它的viewmodel中,我有一个对象列表的属性。我需要为视图上的每个此列表条目动态生成标签和文本字段。因此,我决定为此实现一个自定义视图。这是我到目前为止尝试过的:

在我的viewcontroller中,在CreateView中,我只需添加自定义UIView。我可以在视图中看到它的内容。在ViewDidLoad()中,我创建绑定:

private void CreateBindings()
{
var set = this.CreateBindingSet<MyController, MyViewModel>();
set.Bind(myCustomControl).For(x => x.DataContext).To(vm => vm.MyListOfObjects);
set.Apply();
}

MyCustomControl代码如下:

public class MyCustomControl : MvxView
{
public MyCustomControl() {

//DataContext is always null here!
//I'd like to get access to list of objects here, add controls for each entry and make sure they are binded to a viewmodel's list of objects somehow.
}

}

我注意到,在进行MyCustomControl的构造函数调用之后,设置了ViewModel中的对象列表,因此,将MyCustom控件中的DataContext为null有意义。我想念一些明显的东西。有人可以指出我正确的方向吗?我将非常感谢。

我尝试了这个示例,这正是我想要实现的目标,但是到目前为止还没有运气;(

N = 32-iPad上的ViewModels和MvxView-MvvmCross的N + 1天 https://www.youtube.com/watch?v=cYu_9rcAJU4&list=PLR6WI6W1JdeYSXLbm58jwAKYT7RQR31-W&index=35&t=1649s

非常感谢!

1 个答案:

答案 0 :(得分:1)

看看您发布的视频中的23:43。 您应该在DelayBind方法内进行视图绑定。

this.DelayBind(() => {
    var set = this.CreateBindingSet<MyCustomControl, MyItemViewModel>();

    set.Bind(badgeLabel).For(v => v.Text).To(x => x.BadgeText);
    set.Bind(topSummary).For(v => v.Text).To(x => x.TopSummary);
    set.Bind(bottomSummary).For(v => v.Text).To(x => x.BottomSummary);

    set.Bind(this.Tap()).For(v => v.Command).To(x => x.Edit);
    set.Apply();
});

MvvmCross将为您执行绑定。 还请注意,必须将正确的类型传递给CreateBindingSet。

在侧面节点上,MvvmCross N + 1个视频来自2013年,此后发生了一些变化。 您可以在那找到一些很好的例子,但是有时它不再起作用了。

如果您不熟悉MvvmCross,请下载Playground项目的源代码以供参考:

https://github.com/MvvmCross/MvvmCross/tree/develop/Projects/Playground

如果需要更多帮助,请加入#mvvmcross松弛频道

https://xamarinchat.herokuapp.com/

MvvmCross真的很棒……一旦掌握了基本概念。