如何绑定数组我mvvmcross

时间:2013-09-30 13:05:04

标签: arrays data-binding mvvmcross

单击时,我需要一个按钮在视图中移动。 我已按以下方式绑定按钮(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中声明整数数组的例子?

1 个答案:

答案 0 :(得分: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的表达式walk对这些类型的局部变量表达式没有任何内置评估。

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

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();
}

作为其他一些选择: