MvvmCross:绑定List的每个Item

本文关键字:Item List 绑定 MvvmCross | 更新日期: 2023-09-27 18:02:59

我想要一个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.MvxListView, MvxItemTemplate属性和CheckBox在模板布局。对于iOS,我无法使绑定工作

MvvmCross:绑定List的每个Item

所以你试图在一个视图内使用两个ViewModels (checklisttitemviewmodel)?如果那不是必要条件,你就不需要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; }
}
相关文章: