2012-04-17 13 views
7

Geçtiğimiz birkaç hafta boyunca MVVMCross çerçevesini kullanarak bir çapraz platform uygulaması (IOS/Android/WP7) geliştirmek için çalışıyorum. Bugün bir problemle karşılaştım, gerçekten nasıl çözeceğimi bilmiyorum, o yüzden umarım doğru yönde beni zorlayabilirsin. IOS yılındaViewModel değişkenlerinden başka bir Görünüme geçme (MVVMCross)

Ben (kod altında bir ViewModel bulunur) başka bir sayfaya gitmeye ilişkin inşaat vardır:

bu IMvxCommand ateşlenir
KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5"); 

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

(düğmesine basıldığında) aşağıdaki Görünüm yüklenir, bu durumda 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 
    } 
} 

Bu yapı IOS iyi çalışıyor, ama benim android App aynı yapıya kullanmak istiyorum: BeckhoffActuatorView kodu ben yukarıdan KeyValuePair kullanın.

ViewModel'deki kod, MVVM'nin tümüyle ilgili olduğu için değişmedi. Ama BackhoffActuatorView kod Android için farklıdır: Yukarıdaki kod çalışmıyor

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 ben IOS kullanmak viewController benzer bir şey uygulamak için görünmüyor. Kod sadece standart kurucuda gelir ve ben bunu tamamen çıkardığımda derleme/çalıştırma olmaz.

RequestNavigate ile gönderdiğim keyvaluepair'e erişebileceğimi bilen var mı? Teşekkür ederim!

cevap

10

MVVMCross çok sözleşmedir - ve mümkün olan her yerde ViewModels arasında ileti aktarma fikri üzerinde çalışır.

kullanarak bir ViewModel giderseniz:

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

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

Eğer kurucuyu kullanarak BeckhoffActuatorViewModel o pick up gerekir:

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

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

Ve görüşleriniz sonra (ViewModel.ShortValue erişebilir iOS için bu, base.ViewDidLoad() 'den sonra, Android için OnCreate() ve OnNavigatedTo'dan sonra WP7 için)

'dan sonra yapılabilir.

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

ve yapıcı kullanılarak searchterm alan bir TwitterViewModel: Bu kullanarak gezinmek çağıran bir HomeViewModel sahiptir

: Bu, TwitterSearch örneğe göz atın:

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

Şu anda bu iletide yalnızca string s izin verildiğini unutmayın - ancak JSON.Net kullanarak her zaman kendi nesnelerinizi dizine ekleyebilir - veya çerçeveyi genişletebilirsiniz - açık kaynak kodudur.

sadece string s, int s, double ler ve bool s şu anda geçen bu yapıcı parametresinde izin verildiğini unutmayın - bu Xaml Url'ler için Android Intents için seri hale gereksinimleri kaynaklanmaktadır. Kendi özel seri hale getirilmiş nesnelerinizi kullanarak gezinti yapmayı denemek isterseniz, lütfen http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html'a bakın.

Ayrıca, anonim nesne navigasyon (RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });) kullanmak istiyorsanız o zaman bir InternalsVisibleTo nitelik ayarlanmış olduğundan emin olmak gerekir unutmayın - https://github.com/slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Properties/AssemblyInfo.cs bkz:

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

Dahası .. soluk kalpli değil ... ve bu "iyi mvvm kodu" değil ... ama bir Android etkinliğinde MvxShowViewModelRequest verilerine gerçekten erişmek/erişmek istiyorsanız, o zaman gelen Niyet'ten ayıklayabilirsiniz - isteği içeren bir Extras dizesi var (’da’den)

+4

Teşekkür ederim Stuart, Twitter örneğini kullanarak sorunumu düzeltmeyi başardım! – David

+0

İyi iş - başka bir parametre geçişine ihtiyacınız varsa, o zaman CustomerManagement ve Kitaplar örneklerini de deneyebilirsiniz :) – Stuart