2012-04-17 3 views
7

지난 몇 주 동안 저는 MVVMCross 프레임 워크를 사용하여 크로스 플랫폼 앱 (IOS/Android/WP7)을 개발하는 중이었습니다. 오늘 나는 문제를 겪었는데, 나는 어떻게 풀어야 할지를 정말로 모른다. 그래서 희망을 갖고 나를 올바른 방향으로 밀어 넣을 수있다. IOS가에서ViewModel에서 다른보기 (MVVMCross)로 변수 전달하기

내가 (코드는 아래의 ViewModel에 있습니다) 다른 페이지로 이동을 위해 건설을 다음 있습니다 :

이 IMvxCommand 해고되어
KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5"); 

public IMvxCommand BeckhoffActuator1 
{ 
    get 
    {   
     return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1)); 
    } 
} 

(버튼을 누를 때) 다음보기가로드, 이 경우 BeckhoffActuatorViewModel.

public class BeckhoffActuatorView : MvxTouchDialogViewController<BeckhoffActuatorViewModel> 
{ 

    ICollection<string> icol; 

    public BeckhoffActuatorView(MvxShowViewModelRequest request) : base(request, UITableViewStyle.Grouped, null, true) 
    { 

     icol = request.ParameterValues.Values; 

    } 

    public override void ViewDidLoad() 
    { 
     //Code 
    } 
} 

이 건설 IOS에서 잘 작동하지만, 나는 내 안드로이드 응용 프로그램에서 동일한 구성을 사용하고자하는 다음 BeckhoffActuatorView의 코드에서 나는 위에서 keyvaluepair를 사용합니다.

ViewModel의 코드는 MVVM의 전체적인 아이디어이므로 변경되지 않았습니다. 그러나 BackhoffActuatorView의 코드는 안드로이드에 대한 다른 : 위의 코드는 작동하지 않습니다

public class BeckhoffActuatorView : MvxBindingActivityView<BeckhoffSensorViewModel> 
{ 
    public ICollection<string> icol; 

    public BeckhoffActuatorView() 
    { 
     Debug.WriteLine("Standard"); 
    } 

    public BeckhoffActuatorView(MvxShowViewModelRequest request) 
    { 
     Debug.WriteLine("Custom"); 

     icol = request.ParameterValues.Values; 
    } 

    protected override void OnViewModelSet() 
    { 

     SetContentView(Resource.Layout.BeckhoffActuatorView); 

    } 
} 

의 MvxBindingActivityView 내가 IOS에서 사용하는의 ViewController 비슷한을 구현하지 않는 것 같습니다. 이 코드는 표준 생성자에만 들어 있으며, 그 코드를 완전히 그대로두면 컴파일되지 않습니다.

누구나 내가 RequestNavigate와 함께 보내는 keyvalue 쌍을 액세스 할 수 있다는 것을 알고 있습니까? 고맙습니다!

답변

10

MVVMCross는 매우 관습적인 기반이며 가능하면 ViewModels간에 메시지를 전달한다는 아이디어에 기반합니다.

당신은 사용하여 뷰 모델로 이동하는 경우 :

다음
KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5"); 

public IMvxCommand BeckhoffActuator1 
{ 
    get 
    {   
     return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1)); 
    } 
} 

하는 생성자를 사용하여 BeckhoffActuatorViewModel에 그 픽업 할 수 있어야한다 :

public class BeckhoffActuatorViewModel : MvxViewModel 
{ 
    public BeckhoffActuatorViewModel(string short) 
    { 
     ShortValue = short; 
    } 

    private string _shortValue; 
    public string ShortValue 
    { 
     get 
     { 
      return _shortValue; 
     } 
     set 
     { 
      _shortValue = value; 
      FirePropertyChanged("ShortValue"); 
     } 
    } 
} 

을 그리고 당신의 견해는 다음 (ViewModel.ShortValue에 액세스 할 수 있습니다 iOS의 경우이 작업은 OnCreate() 이후 Android 용 base.ViewDidLoad(), OnNavigatedTo 이후 WP7 이후에 수행 할 수 있습니다.

private void DoSearch() 
    { 
     RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText }); 
    } 

생성자를 사용하여 SEARCHTERM를받는 TwitterViewModel :이 사용 탐색을 호출하는 HomeViewModel을 가지고

이는 TwitterSearch의 예를 살펴 :

public TwitterViewModel(string searchTerm) 
    { 
     StartSearch(searchTerm); 
    } 

현재 전달중인 메시지에는 string 만 허용됩니다.하지만 JSON.Net을 사용하여 언제든지 자신의 개체를 serialize 할 수 있습니다. 또는 프레임 워크를 확장 할 수 있습니다. 오픈 소스입니다.

string의, int의, double s와 bool의가 현재 전달이 생성자 매개 변수에 허용 있습니다 -이 XAML URL에 안드로이드 인 텐트에 대한 직렬화 요구 사항 때문입니다. 고유 한 사용자 지정 직렬화 된 개체를 사용하여 탐색을 실험하려면 http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html을 참조하십시오.

는 또한, 당신은 익명의 객체 탐색 (RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });)를 사용하려는 경우 다음 당신은 InternalsVisibleTo 속성이 설정되어 있는지 확인해야합니다주의 - https://github.com/slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Properties/AssemblyInfo.cs를 참조하십시오

[assembly: InternalsVisibleTo("Cirrious.MvvmCross")] 

또한 .. 이건 "좋은 MVv 코드가 아니야 ..."하지만 안드로이드 활동 내에서 MvxShowViewModelRequest 데이터에 액세스하고 싶다면/들어오는 의도에서 추출 할 수 있습니다. 요청이 들어있는 Extras 문자열이 있습니다 (CreateViewModelFromIntent의 비 직렬화 참조). https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs)

+4

스튜어트에게 트위터 예를 사용하여 문제를 해결할 수있었습니다. – David

+0

좋은 직장 - 매개 변수 전달의 또 다른 예제가 필요하면 CustomerManagement 및 Books 샘플도 시도해보십시오 :) – Stuart