Привязка команды Button не работает в Xamarin.Формы
я хотел бы привязать команду к свойству command моей кнопки. Это казалось довольно простым, так как я делал это много раз раньше в WPF, и метод здесь очень похож. Позвольте мне показать некоторые фрагменты кода.
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>
код
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;}
конструктора:
public ViewModel()
{
IncreaseCommand = new Command (() => IncreaseExecuted ());
number = 0;
numberText = number.ToString ();
OnPropertyChanged (numberText);
}
и тогда
private void IncreaseExecuted()
{
number++;
numberText = number.ToString ();
OnPropertyChanged (numberText);
}
когда я запускаю приложение с помощью Xamarin Android Player (KitKat), я вижу кнопку и надпись 0. Затем я нажимаю кнопку, и ничего не происходит. Я попытался проверить, что происходит с точками останова, но приложение не останавливается, даже когда они находятся в конструкторе моей ViewModel. Думаю, это как-то связано с эмулятором. В любом случае, я думаю, что привязка в порядке, так как я вижу "0" на экране. В чем может быть проблема? Позвольте мне показать мой класс ViewModelBase на всякий случай:--13-->
ViewModelBase
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
может быть, мой numberText
свойство не обновляется, когда я называю OnPropertyChanged
? Но я использовал тот же самый класс ViewModelBase несколько раз раньше, и он всегда работал нормально. И последнее, мой CustomPage
страница завернута в NavigationPage
, который является ребенком TabbedPage
:
файл MainPage.код XAML.cs
this.Children.Add (new NavigationPage (new CustomPage ()) {Title="Something"} );
это не должно влиять ни на что, но есть это просто в случай. Так что не так с моей командой? Заранее спасибо!
1 ответов
вы почти там. Внимательно посмотрите на свой вызов метода OnPropertyChanged; вы передаете значение numberText, а не имя. Если вы измените свой код, чтобы передать "numberText", я ожидаю, что он будет работать правильно.
Edit: я должен добавить, что вызов OnPropertyChanged в конструкторе имеет ту же проблему. Причина, по которой вы видите "0" при запуске, заключается в том, что представление просто использует существующую привязку для получения значения.
Edit 2: Теперь, что Xamarin поддерживает C# 6.0, вы можете использовать новое "имя" выражение, которое устраняет необходимость в жестко-закодированных строк. Кроме того, вы можете использовать MvvmCross, MvvmLight, или XLabs' в MVVM классов.