如何绑定阵列我mvvmcross(How to bind arrays i mvvmcross)

2019-10-18 16:43发布

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

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

在视图模型我有“正常”的属性

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

我的问题是在视图模型,我不知道如何让RaisePropertyChanged火在数组列表中的个别项目。 是否有人对如何申报模型视图整数数组的例子吗?

Answer 1:

一般的回答是,如果你想火RaisePropertyChanged一个子视图模型,那么最简单的方法是使子视图模型支持INotifyPropertyChanged

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

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

      // etc
 }

和你的页面级视图模型可以再存储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();
}

至于其他一些备选方案:

  • 你可以尝试,而不是使用某种集合类的绑定。 对于这样的一个例子,请参见组僵尸是如何结合到N的第二部分映射注释= 38 - http://slodge.blogspot.co.uk/2013/09/n38-more-maps-and-更zombies.html
  • 你可以改为尝试建立您的按钮意见MvxView对象-每个都有自己的内部绑定。 有关这方面的想法,见N = 32在http://slodge.blogspot.co.uk/2013/06/n32-truth-about-viewmodels-starring.html


文章来源: How to bind arrays i mvvmcross