繁体   English   中英

MvvmCross:绑定列表的每个项目

[英]MvvmCross: Bind each Item of a List

我想要一个ChecboxElements列表,其中第一个设置了单击时所有其他项目的选中状态。

我可以正确绑定第一个,但是对于子元素,我遇到了一些问题。

如何动态添加项目并将其绑定到列表中对象的属性?

var checkboxElement = new CheckboxElement("[All]");

var set = this.CreateBindingSet<LocationFilterView, LocationFilterViewModel>();
set.Bind(checkboxElement).For(v => v.Value).To(vm => vm.AllChecked).TwoWay();
section.Add(checkboxElement);

var checkListBindingSet = this.CreateBindingSet<LocationFilterView, CheckListItemViewModel>();
foreach (var checkListItem in ViewModel.As<LocationFilterViewModel>().CheckList)
{
    var item = new CheckboxElement(checkListItem.Caption);

    checkListBindingSet.Bind(item).For(v => v.Value).To(vm => vm.IsChecked).TwoWay();

    section.Add(item);
}

set.Apply();
checkListBindingSet.Apply();

编辑:也许我不得不以一种更简单的方式问这个问题:我想在单个页面上显示检查选项的列表(而不是单选),复选框视图模型保存在主视图模型的列表中。 在Android中,可以使用Mvx.MvxListViewMvxItemTemplate属性和模板布局中的CheckBox轻松完成此操作。 对于iOS,我只是无法使绑定正常工作...

因此,您是否尝试在一个视图(CheckListItemViewModel)中使用两个ViewModel? 如果这不是必需的,则不需要checkListBindingSet; 所以..

foreach (var checkListItem in ViewModel.CheckLists)
{
    var item = new CheckboxElement(checkListItem.Caption);

    set.Bind(item).For(v => v.Value).To(vm => vm.IsChecked).TwoWay();

    section.Add(item);
}

应该做到这一点;

我自己找到了解决方案(但Rana实际上指向了正确的方向):我不得不将元素绑定到单独的视图中:

// ...
var set = this.CreateBindingSet<LocationFilterView, LocationFilterViewModel>();

var selectAll = new ActivityElement { Caption = "All", Animating = false, ShouldDeselectAfterTouch = true };
set.Bind(selectAll).For(v => v.SelectedCommand).To(vm => vm.SelectAllCommand).TwoWay();
sectionButtons.Add(selectAll);

var selectNone = new ActivityElement { Caption = "None", Animating = false, ShouldDeselectAfterTouch = true };
set.Bind(selectNone).For(v => v.SelectedCommand).To(vm => vm.SelectNoneCommand).TwoWay();
sectionButtons.Add(selectNone);

var checkListItemViewModels = this.ViewModel.As<LocationFilterViewModel>().CheckList;
foreach (var view in checkListItemViewModels.Select(checkListItem => new CheckListItemView { ViewModel = checkListItem }))
{
    view.CheckboxElement.Caption = view.ViewModel.Caption;

    section.Add(view.CheckboxElement);
}

set.Apply();
// ...

public class CheckListItemView : BaseView
{
    public CheckListItemView()
    {
        var set = this.CreateBindingSet<CheckListItemView, CheckListItemViewModel>();

        var item = new CheckboxElement();

        set.Bind(item).For(v => v.Value).To(vm => vm.IsChecked).TwoWay();

        set.Apply();

        this.CheckboxElement = item;
    }

    public new CheckListItemViewModel ViewModel
    {
        get { return base.ViewModel.As<CheckListItemViewModel>(); }
        set { base.ViewModel = value; }
    }

    public Element CheckboxElement { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM