2013-09-30 2 views
1

클릭하면보기에서 이동하려면 단추가 필요합니다. 나는 내가 '정상'속성 배열을 바인딩하는 방법 i mvvmcross

private int _buttonX; 
public int ButtonX 
{ 

    get { return _buttonX; } 
    set { _buttonX = value; RaisePropertyChanged(() => ButtonX); } 

} 

이 제대로 작동 등이 뷰 모델에서 다음과 같은 방법 (안드로이드)

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

에있는 버튼을 결합했다. 지금은 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 
} 

및 페이지 수준의 뷰 모델은 사람들의 List 또는 ObservableCollection 저장할 수 :

public class MyViewModel : MvxViewModel 
{ 
     private readonly List<ButtonViewModel> _buttons; 
     public List<ButtonViewModel> Buttons 
     { 
      get { return __buttons; } 
     } 

     // etc 
} 

일반적으로이 방법으로 문제에 접근합니다. 그러면 바인딩이 작동 할 수있게됩니다.


그러나 ... 특정 코드의 경우 고려해야 할 또 다른 문제가 있습니다.

귀하의 바인딩 문은 바인딩 식에 대한 루프 변수가 포함

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

:

을 참조하십시오.
관련 문제