【问题标题】:MvvmCross: Bind each Item of a ListMvvmCross:绑定列表的每一项
【发布时间】:2014-06-29 22:44:14
【问题描述】:

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

【问题讨论】:

    标签: c# binding xamarin mvvmcross


    【解决方案1】:

    那么您是否尝试在一个视图中使用两个 ViewModel (CheckListItemViewModel)?如果这不是要求,那么您不需要 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);
    }
    

    应该做的伎俩;

    【讨论】:

    • 嗨拉娜,感谢您的帮助。这也是我的第一次尝试,但它不起作用,因为绑定行上的=&gt; vm 部分是指当前页面视图模型,但我需要绑定到CheckListItemViewModel。实际上,我确实是一个视图中的两个视图模型。我认为,问题出在我的行var checkListBindingSet = this.CreateBindingSet&lt;LocationFilterView, CheckListItemViewModel&gt;();
    • 嗨 Grid,我不确定在这种情况下 checkListBindingSet 应该如何工作;我可以看到,该集合不会以任何方式引入您的视图。如果确实需要两个 VM,您是否尝试过将 CheckListItemViewModel 作为您的 View 连接到的主 ViewModel 的属性?这应该工作
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2017-07-18
      • 2013-10-17
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多