我有我的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的值立即更新取決於你在點擊了什麼StartPage
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");
}
}
現在我只在我的日誌中看到「值爲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`
}
INotifyPropertyChanged的目的是當屬性值在setter中更改時觸發PropertyChanged事件。你的二傳手是空的。您還在一個屬性(currentValue)上使用INPC,但修改了不同的屬性App.value1。如果要在value1更改時更新,請更新value1的setter以實現INPC。如果您不使用數據綁定,則需要手動設置PropertyChanged處理程序,如果您希望它執行任何操作。最後,如果你正在將它的值解析爲一個int,爲什麼是currentValue一個字符串屬性? – Jason
好的,直接做一個int而不是一個字符串,然後把它變成一個int。將我的getter中的viewmodel中的當前代碼移到我的setter中?並且爲了回答你的問題,我在這裏沒有使用數據綁定,只是改變int的值並根據當前值使代碼可見 – Yannick
現在更新了代碼並進行了兩處更改。將代碼移動到setter,並直接將我的viewmodel上的「currentValue」設置爲int。現在缺少什麼?我如何手動設置propertychanged處理程序? – Yannick