【问题标题】:How to bind arrays i mvvmcross如何在 mvvmcross 中绑定数组
【发布时间】:2014-06-20 19:28:32
【问题描述】:

当点击它时,我需要一个按钮在视图中移动。 我已通过以下方式绑定按钮(Android)

set.Bind(_paramsButton).For(pb => pb.LeftMargin).To(vm => vm.ButtonX).OneWay();
set.Bind(_paramsButton).For(pb => pb.TopMargin).To(vm => vm.ButtonY).OneWay();
set.Bind(_paramsButton).For(pb => pb.Height).To(vm => vm.ButtonHight).OneWay();
set.Bind(_paramsButton).For(pb => pb.Width).To(vm => vm.ButtonWidth).OneWay();

在 viewModel 中,我具有“正常”属性

private int _buttonX;
public int ButtonX
{

    get { return _buttonX; }
    set { _buttonX = value; RaisePropertyChanged(() => ButtonX); }

}

等等

这工作正常。 现在我有 10 个按钮,想绑定喜欢

for(int i=0; i<10; i++){ 

    set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.ButtonX[i]).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.TopMargin).To(vm => vm.ButtonY[i]).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.Height).To(vm => vm.ButtonHight[i]).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.Width).To(vm => vm.ButtonWidth[i]).OneWay();

}

for(int i=0; i<10; i++){ 
    set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.Button[i].X).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.TopMargin).To(vm => vm.Button[i].Y).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.Height).To(vm => vm.Button[i].Height).OneWay();
    set.Bind(_paramsButton[i]).For(pb => pb.Width).To(vm => vm.Button[i].Width).OneWay();
}

我的问题出在 viewModel 中,我不知道如何让 RaisePropertyChanged 触发数组列表中的各个项目。 有人有关于如何在modelView中声明整数数组的例子吗?

【问题讨论】:

    标签: arrays data-binding mvvmcross


    【解决方案1】:

    一般的答案是,如果您想为子视图模型触发 RaisePropertyChanged,那么最简单的方法是让该子视图模型支持 INotifyPropertyChanged

    因此,例如,您可以有一个 ButtonViewModel 子类,例如:

     public class ButtonViewModel : MvxNotifyPropertyChanged
     {
          private int _x;
          public int X
          {
              get { return _x; }
              set { _x = value; RaisePropertyChanged(() => X); }
          }
    
          // etc
     }
    

    然后您的页面级 ViewModel 可以存储其中的 ListObservableCollection

     public class MyViewModel : MvxViewModel
     {
          private readonly List<ButtonViewModel> _buttons;
          public List<ButtonViewModel> Buttons
          {
              get { return __buttons; }
          }
    
          // etc
     }
    

    一般来说,这是解决问题的方法 - 这应该允许绑定工作。


    但是...对于您的特定代码,还有另一个问题需要考虑。

    您的绑定语句在绑定表达式中包含一个 for 循环变量:

    for(int i=0; i<10; i++){ 
        set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.Button[i].X).OneWay();
    }
    

    恐怕这根本就行不通 - MvvmCross 的表达式遍历对这些类型的局部变量表达式没有任何内置评估。

    您可以改为为绑定语句生成一个字符串,例如:

    for(int i=0; i<10; i++){ 
        var to = string.Format("Button[{0}].X", i);
        set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(to).OneWay();
    }
    

    作为其他一些选择:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多