Привязка команды 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 классов.