MvvmCross:绑定列表的每个项目

时间:2014-05-12 14:07:18

标签: c# binding xamarin mvvmcross

我想要一个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,我只是无法使绑定工作...

2 个答案:

答案 0 :(得分:2)

您是否尝试在一个View(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);
}

应该做的伎俩;

答案 1 :(得分:0)

我自己找到了解决方案(但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; }
}