1

我需要一个按钮来在视图中移动,当它被点击时。我已通过以下方式绑定按钮(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 触发数组列表中的各个项目。有人有关于如何在模型视图中声明整数数组的示例吗?

4

1 回答 1

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

作为其他一些选择:

于 2013-09-30T14:07:55.120 回答