我的MasterDetailPage
上有一个按钮可以更改INT上的值(名为App.value1),具体取决于您点击的内容如下:
void click1 (object s, EventArgs a)
{
if (App.value1 == 0) {
App.value1 = App.value1 + 1;
} else {
App.value1 = 0;
}
}
我想让这个点击功能立即更改我的StartPage上的值(另一个ContentPage
)。所以我创建了一个看起来像这样的viewmodel,在那里我尝试使用当前值:
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;
}
}
}
这是StartPage
我希望INT的值立即更新,具体取决于您在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");
}
}
}
和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 :(得分: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
来通知View currentValue
更改。
但是,我认为更好的解决方案是在MasterDetailPage
和StartPage
之间共享视图模型,因为使用全局状态会使您的解决方案难以理解:
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
的相同实例