2013-09-30 31 views
1

我需要一个按钮来移动视图,当它被点击。 我已绑定按钮以下列方式(机器人)如何绑定阵列我mvvmcross

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火在单个项目数组列表。 有没有人有关于如何在modelView中声明整数数组的示例?

回答

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

由于一些其他的替代品: