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`
}
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
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
Ş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