Button command binding nicht funktioniert in Xamarin.Formen
Ich würde gerne binden, einen Befehl an die command-Eigenschaft von mein-button. Dieser schien ziemlich einfach, da ich dies getan viele Male zuvor in WPF und der Methode, die hier ist sehr ähnlich. Lassen Sie mich zeigen einige code-snippets.
XAML
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.View.CustomPage"
Title="Something">
<ContentPage.Content>
<StackLayout>
<Button x:Name="numBtn" Text="Increase number" Command="{Binding IncreaseCommand}" />
<Label x:Name="numLabel" Text="{Binding numberText}" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
Code-behind -
public partial class CustomPage : ContentPage
{
public CustomPage ()
{
InitializeComponent ();
BindingContext = ViewModelLocator.ViewModel(); //ViewModelLocator is singleton, gives
//you a ViewModel instance
}
}
ViewModel
public ICommand IncreaseCommand { get; private set; }
private int number;
public string numberText { get; private set;}
Konstruktor:
public ViewModel()
{
IncreaseCommand = new Command (() => IncreaseExecuted ());
number = 0;
numberText = number.ToString ();
OnPropertyChanged (numberText);
}
dann
private void IncreaseExecuted()
{
number++;
numberText = number.ToString ();
OnPropertyChanged (numberText);
}
Wenn ich die app mit Xamarin Android Player (KitKat) sehe ich den button und das label Lesen 0. Dann drücke ich den Knopf und nichts passiert. Ich habe versucht, die Kontrolle was passiert mit den breakpoints, die app jedoch nicht anhalten, auch nicht, wenn Sie in den Konstruktor von meinem ViewModel. Ich denke, es ist etwas zu tun mit dem emulator. Wie auch immer, ich denke, die Bindung ist ok, da kann ich sehen, eine "0" auf dem Bildschirm. Was könnte das problem sein? Lassen Sie mich zeigen, meine Klasse ViewModelBase nur für den Fall:
ViewModelBase
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Vielleicht mein numberText
- Eigenschaft nicht aktualisiert, wenn ich rufe OnPropertyChanged
? Aber ich habe den genauen gleichen Klasse ViewModelBase mehrmals vor, und es funktionierte immer gut. Eine Letzte Sache, meine CustomPage
Seite ist verpackt in eine NavigationPage
was ist ein Kind einer TabbedPage
:
MainPage.xaml.cs
this.Children.Add (new NavigationPage (new CustomPage ()) {Title="Something"} );
Diese sollten nicht auf irgendetwas, aber es ist nur für den Fall. Also, was ist falsch mit meinem Befehl verbindlich? Vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie fast da. Nehmen Sie einen Blick auf Ihr Anruf an die OnPropertyChanged-Methode; Sie übergeben den Wert numberText und nicht der name. Wenn Sie den code ändern, um pass "numberText" ich erwarte, dass es wird funktionieren.
Edit: ich sollte hinzufügen, dass die die OnPropertyChanged-Aufruf in den Konstruktor hat das gleiche problem. Der Grund, warum Sie sehen, "0" beim Start ist, dass die Sicht wird einfach mit der vorhandenen Bindung an den Wert abzurufen.
Edit 2: Nun, die Xamarin unterstützt C# 6.0, die Sie verwenden können, die neuen "nameof" - Ausdruck, der eliminiert die Notwendigkeit für einen hart-codierten string. Alternativ können Sie MvvmCross, MvvmLight, oder XLabs' MVVM-Klassen.
Diese Antwort bezieht sich nicht direkt auf das problem der ursprünglichen Frage, aber diese Frage ist eine, die höchste Ranking in den Suchmaschinen und der Titel dieser Frage ist mehrdeutig auf die Frage, die diese Antwort Antworten.
Ich hatte Probleme mit einem
Command
würde nicht ausgelöst, die zugehörigen Befehl Aktion. Mein problem war, dass ich definiert hatte dieCommand
alsfield
statt einerproperty
.Funktioniert:
Nicht funktioniert:
Hoffe, dies hilft jemand anderes.