我在使用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
非常感谢!
答案 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真的很棒……一旦掌握了基本概念。