2013-09-30 80 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(); 
} 

由於一些其他的替代品: