2016-03-19 4 views
0

Ben benim MasterDetailPage üzerinde bir düğme, bir INT (App.value1 adlandırılır) böyle bakıyor tıklayın şeye bağlı üzerindeki değerini değiştirerek vardır:Xamarin formlar,

void click1 (object s, EventArgs a) 
{ 
    if (App.value1 == 0) { 

     App.value1 = App.value1 + 1; 

    } else { 
     App.value1 = 0; 
    } 
} 

Ve Bu tıklama işlevinin StartPage (başka bir ContentPage) değerindeki değeri hemen değiştirmesini istiyorum. Bu yüzden şimdiki değeri ile çalışmak için denemek böyle bakan bir ViewModel oluşturduk:

public event PropertyChangedEventHandler PropertyChanged; 

protected virtual void OnPropertyChanged (string propertyName) 
{ 
    var changed = PropertyChanged; 
    if (changed != null) { 

     PropertyChanged (this, new PropertyChangedEventArgs (propertyName));  
    } 
} 

public int currentValue { 

     get { 
      return App.value1; 
     } 

     set { 

      if (App.value1 == 0) { 
       App.value1 = 0; 

      } else { 

       App.value1 = 1; 
      } 

     } 


    } 

Ve bu en tıkladıkları bağlı derhal güncellemek için INT değeri istiyorum StartPage olduğunu MasterDetailView.

public StartPage() 
{ 
     var ourView = new StartPageViewModel(); 

     ourCurrentValue = ourView.currentValue; 
} 

protected async override void OnAppearing() 
{ 
    LoadData(); 
} 


private async Task<List<Pin>> LoadData() //I work with pins here (not showing that code though as it is irrelavant. 
{ 
    if (ourCurrentValue == 0) { 
     System.Diagnostics.Debug.WriteLine ("Value is 0"); 
    } 

    else { 
     System.Diagnostics.Debug.WriteLine ("Value is 1"); 
    } 
} 

Şu anda yalnızca günlüğümde "Değer 0" görüyorum. MasterDetailPage numaralı düğmedeki düğmeyi tıkladığımda hiçbir şey güncellenmez.

GÜNCELLEME KODU:

public class StartPageViewModel : INotifyPropertyChanged 
{ 
    private ICommand clickCommand; 
    private int currentValue; 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged (string propertyName) 
    { 
     var changed = PropertyChanged; 
     if (changed != null) 
     { 
      PropertyChanged (this, new PropertyChangedEventArgs (propertyName));  
     } 
    } 


    public StartPageViewModel() 
    { 
     ClickCommand = new Command(() => CurrentValue = CurrentValue + 1); 
    } 

    public ICommand ClickCommand 
    { 
     get { return clickCommand; } 
     set 
     { 
      clickCommand = value; 
      OnPropertyChanged("ClickCommand"); 
     } 
    } 
    public int CurrentValue 
    { 
     get { return currentValue; } 
     set 
     { 
      currentValue = value; 
      OnPropertyChanged("CurrentValue"); 
     } 
    } 

} 

Ve StartPage:

public StartPage() 
    { 
     App.PropertyChanged += (sender, args) => OnPropertyChanged("currentValue"); // ERROR: `An object reference is requiered to access non-static member 'Xamarin.Forms.BindableObject.PropertyChanged` 
    } 
+0

INotifyPropertyChanged'in amacı, özellik değerinin ayarlayıcısında değiştiğinde PropertyChanged olayını tetiklemektir. Belirleyiciniz boş. Ayrıca, INPC'yi bir mülkte (currentValue) kullanıyor ancak farklı bir özellik App.value1'i değiştiriyorsunuz. Değer1 değiştiğinde güncellenmek isterseniz, INPC'yi uygulamak için değer1'in ayarlayıcısını güncelleyin. Ve eğer veri bağlama kullanmıyorsanız, bir şey yapmasını istiyorsanız, bir PropertyChanged işleyiciyi el ile ayarlamanız gerekecektir. Son olarak, neden bir değer olarak ayrıştırılıyorsanız, currentValue dizesi özelliği nedir? – Jason

+0

Tamam, bir dize yerine doğrudan bir int yapın ve sonra bir int'ye dönüştürün. Geçerli kodu benim viewmodel'imdeki alıcım yerine alıcımın üzerine getirin?Ve sorunuzu cevaplamak için sadece int değerini değiştirmek ve geçerli değere bağlı olarak kod görünür hale getirmek için veri bağlama kullanmıyorum. – Yannick

+0

Şimdi iki değişiklikle kodu güncellendi. Kodu setter'e taşıdım ve viewmodelimde "currentValue" yi doğrudan bir int yapın. Şimdi ne eksik? Propertychanged işleyiciyi el ile nasıl ayarlayabilirim? – Yannick

cevap

1

Böyle bir şey ile devam edebilirsiniz:

olun sizin App sınıf ve bu sınıfın içine value1 mülkiyetinde değişiklik aşağıdadır:

public static event PropertyChangedEventHandler PropertyChanged; 

private static void OnPropertyChanged (string propertyName) 
{ 
    var changed = PropertyChanged; 
    if (changed != null) 
    { 
     PropertyChanged (null, new PropertyChangedEventArgs (propertyName));  
    } 
} 

private static int _value1; 
public static int value1 
{ 
    get { return _value1; } 
    set 
    { 
     _value1 = value; 
     OnPropertyChanged("value1"); 
    } 
} 

Sonra StartPageViewModel kurucusuna bu satırı ekleyin:

App.PropertyChanged += (sender, args) => OnPropertyChanged("currentValue"); 

sadece (hatta bunun için kendi etkinlik oluşturabilirsiniz) kendi amaçları için PropertyChanged yararlanarak olduğunu kodunda. App sınıfındaki PropertyChanged etkinliğine StartPageViewModel abonesi demek istiyorum, bu nedenle value1 değiştiğinde bildirilir. Ve aslında gerçekleştiğinde, o zaman currentValue değişikliği hakkında bildirmek için kendi PropertyChanged çağırıyor.

Ancak, küresel devlet kullanarak sert çözüm anlamak için yapar, çünkü daha iyi bir çözüm, MasterDetailPage ve StartPage arasında Görünüm Model paylaşmak için olduğunu söyleyebilirim:

public class SharedViewModel : INotifyPropertyChanged 
{ 
    private ICommand clickCommand; 
    private int currentValue; 

    /* INotifyPropertyChanged implementation */ 

    public SharedViewModel() 
    { 
     ClickCommand = new Command(() => CurrentValue = CurrentValue + 1); 
    } 

    public ICommand ClickCommand 
    { 
     get { return clickCommand; } 
     set 
     { 
      clickCommand = value; 
      OnPropertyChanged("ClickCommand"); 
     } 
    } 
    public int CurrentValue 
    { 
     get { return currentValue; } 
     set 
     { 
      currentValue = value; 
      OnPropertyChanged("CurrentValue"); 
     } 
    } 
} 

Ve içinde SharedViewModel aynı örneği kullanmak gerekir MasterDetailPage yanı sıra StartPage

+0

Benim korumalı bir sanal boşluktan benim viewmodel özel bir statik boşluğa değiştirdiğimde bana hata verir. Ayrıca bu iki hatayı OnPropertyChanged ("value1"); 've' App.PropertyChanged + = (gönderen, args) => OnPropertyChanged ("currentValue"); 'dır: ' -static üyesi 'Xamarin.Forms.BindableObject.PropertyChanged'' – Yannick

+0

' App' sınıfınız Model mi? –

+0

Şu an kayboldum haha. Bu kodu projectname CS dosyasına eklemeliyim mi? Kamu sınıfında Uygulama: İçinde uygulama var mı? – Yannick