2014-12-13 19 views
6

içinde çalışmıyor Düğmemdeki komut özelliğine bir komut bağlamak istiyorum. Bu, WPF'de daha önce birçok kez yaptığım ve yöntemin çok benzer olduğu için oldukça basit görünüyordu. Bazı kod snippet'lerini göstereyim.Düğme komut bağlaması Xamarin.Forms

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> 

-arkasında Kod

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;} 

yapıcısı:

public ViewModel() 
{ 
    IncreaseCommand = new Command (() => IncreaseExecuted()); 
    number = 0; 
    numberText = number.ToString(); 
    OnPropertyChanged (numberText); 
} 

ve sonra

private void IncreaseExecuted() 
{ 
    number++; 
    numberText = number.ToString(); 
    OnPropertyChanged (numberText); 
} 

Ben Xamarin Android Player (KitKat) Ben düğmesini görmek kullanarak uygulamayı çalıştırın ve etiket 0. okuma Sonra düğmesine basın ve hiçbir şey olmuyor. Kesme noktaları ile ne olduğunu kontrol ettim ancak uygulama ViewModel'in kurucusundayken bile duraklama yapmıyor. Sanırım emülatör ile ilgili bir şey. Her neyse, bence ekranın üzerinde "0" görebildiğim için ciltleme tamam. Sorun ne olabilir? Beni her ihtimale karşı benim ViewModelBase sınıfını gösterelim:

ben OnPropertyChanged çağırdığınızda Belki benim numberText mülkiyet güncellenen almaz

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

ViewModelBase? Ama aynı ViewModelBase sınıfını daha önce birkaç kez kullandım ve her zaman iyi çalıştı. Son bir şey, benim CustomPage sayfa bir TabbedPage çocuğu olan bir NavigationPage içine sarılır: Bu şey etkilememelidir

this.Children.Add (new NavigationPage (new CustomPage()) {Title="Something"}); 

MainPage.xaml.cs ama orada sadece içindedir vaka. Peki benim emir bağlayıcımın nesi var? Şimdiden teşekkür ederim!

cevap

5

Neredeyse oradasınız. OnPropertyChanged yöntemine yapılan çağrıya yakından bakın; numberText değerini değil, ismini geçiyorsunuz. Kodunuzu "numberText" geçecek şekilde değiştirirseniz, düzgün çalışmasını beklerim.

Düzenleme: Yapıcıdaki OnPropertyChanged çağrısının aynı soruna sahip olduğunu eklemeliyim. Başlangıçta "0" görmenizin nedeni, görünümün değeri almak için mevcut bağlamayı kullanmasıdır.

Düzenleme 2: Artık Xamarin C# 6.0'ı desteklediğinden, kodlanmış bir dize gereksinimini ortadan kaldıran yeni "ad" deyimini kullanabilirsiniz. Alternatif olarak, MvvmCross, MvvmLight veya XLab'ların MVVM sınıflarını kullanabilirsiniz.

+0

Bu günlerde kurtarıcım gibi görünüyorsun! Benim ikinci sorum, sizin tarafınızdan cevaplandı. Çok teşekkür ederim! Bu çaylak bir hataydı, nasıl bu kadar aptal olabileceğimi bilmiyorum. –

+0

Çok yaygın bir veri bağlama sorunu var. PropertyChangedEventArgs bir dize aldığından, dağıtılması ÇOK kolaydır.Refactoring nedeniyle isim değişiklikleri en sık gördüğüm yerlerdir. Bu amaçla, bir dize yerine giriş olarak bir ifade alan bir ViewModelBase uygulamasının kullanılmasını öneririm ve bu nedenle, olay adı kodunun güncellenmesine gerek kalmadan özellik adı değiştirilirse, yapı hatalarına neden olur. MvvmLight ve MvvmCross bunu sağlıyor. –

+0

Anladım. İyi fikir, bunu uygulayacağım. Teşekkür ederim! –