2016-03-19 36 views
0

我有我的MasterDetailPage一個按鈕,改變對一個INT(名爲App.value1),這取決於你點擊尋找這樣的事情的價值:Xamarin的形式,與OnPropertyChanged正與一個int值

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

     App.value1 = App.value1 + 1; 

    } else { 
     App.value1 = 0; 
    } 
} 

而且我想要這個點擊功能立即改變我的StartPage上的值(另一個ContentPage)。所以,我創建了一個視圖模型看起來像這樣,在那裏我嘗試用電流值的工作:

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

     } 


    } 

而這正是我想要的INT的值立即更新取決於你在點擊了什麼StartPageMasterDetailView

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

現在我只在我的日誌中看到「值爲0」。當我點擊MasterDetailPage上的按鈕時,沒有任何更新。

更新的代碼:

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

} 

而且起始頁:

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的目的是當屬性值在setter中更改時觸發PropertyChanged事件。你的二傳手是空的。您還在一個屬性(currentValue)上使用INPC,但修改了不同的屬性App.value1。如果要在value1更改時更新,請更新value1的setter以實現INPC。如果您不使用數據綁定,則需要手動設置PropertyChanged處理程序,如果您希望它執行任何操作。最後,如果你正在將它的值解析爲一個int,爲什麼是currentValue一個字符串屬性? – Jason

+0

好的,直接做一個int而不是一個字符串,然後把它變成一個int。將我的getter中的viewmodel中的當前代碼移到我的setter中?並且爲了回答你的問題,我在這裏沒有使用數據綁定,只是改變int的值並根據當前值使代碼可見 – Yannick

+0

現在更新了代碼並進行了兩處更改。將代碼移動到setter,並直接將我的viewmodel上的「currentValue」設置爲int。現在缺少什麼?我如何手動設置propertychanged處理程序? – Yannick

回答

1

您可以用類似的東西着手:

製作以下更改App類和類中value1屬性:

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

,這一行添加到您的StartPageViewModel構造:

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

在該代碼中你只是利用PropertyChanged自己的目的(你甚至可以創建你自己的事件)。 我的意思是StartPageViewModel訂閱PropertyChanged事件App類,所以它會在value1更改時通知。並且當它真的發生時,那麼它正在調用他自己的PropertyChanged來通知查看關於currentValue的更改。

但是,我要說的更好的辦法是MasterDetailPageStartPage之間共享視圖模型,因爲使用全局狀態,使您的解決方案很難理解:

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

而且你需要使用的SharedViewModel相同的實例中MasterDetailPage以及StartPage

+0

當我從一個受保護的虛擬無效更改爲我的viewmodel中的私人靜態無效時給我錯誤。我還在'OnPropertyChanged(「value1」);'和App.PropertyChanged + =(sender,args)=> OnPropertyChanged(「currentValue」);'它說:'一個對象引用被要求訪問非-static member'Xamarin.Forms.BindableObject.PropertyChanged'' – Yannick

+0

你的'App'類是View Model? –

+0

我現在很失落哈哈。我應該在我的項目名稱CS文件中添加此代碼嗎?裏面有公共類App:Application'嗎? – Yannick