2014-09-18 12 views
11

Jestem całkowitym nowicjuszem z wiązaniami w Xaml i naprawdę nie rozumiem tego czasami.wiązanie xamarin.forms z xaml do właściwości

mam to w moim XAML:

<ActivityIndicator IsRunning="{Binding IsLoading}" IsVisible="{Binding IsLoading}" /> 

wiązanie "IsLoading". Gdzie mogę zadeklarować/ustawić tę właściwość ?!

Moi .cs wygląda następująco:

.... 
    public bool IsLoading; 

    public CardsListXaml() 
    { 
     InitializeComponent(); 
     IsLoading = true; 
.... 

Odpowiedz

12

Wiązania są zazwyczaj rozwiązany od nieruchomości BindingContext (w innych implementacjach, ta właściwość jest nazywany DataContext). Domyślnie jest to null (przynajmniej w innych implementacjach XAML), więc twój widok nie może znaleźć określonych właściwości.

W twoim przypadku, należy ustawić właściwość BindingContext do this:

public CardsListXaml() 
{ 
    InitializeComponent(); 
    BindingContext = this; 
    IsLoading = true; 
} 

Jednak samo to nie wystarczy. Twoje obecne rozwiązanie nie implementuje mechanizmu powiadamiania o widokach zmian właściwości, więc Twój widok musiałby wdrożyć INotifyPropertyChanged. Zamiast tego proponuję wdrożyć wzór Model-View-ViewModel, który nie tylko pasuje estetycznie z wiązania danych, ale spowoduje bardziej zarządzalny i sprawdzalne bazy kodu:

public class CardsListViewModel : INotifyPropertyChanged 
{ 
    private bool isLoading; 
    public bool IsLoading 
    { 
     get 
     { 
      return this.isLoading; 
     } 

     set 
     { 
      this.isLoading = value; 
      RaisePropertyChanged("IsLoading"); 
     } 
    } 

    public CardsListViewModel() 
    { 
     IsLoading = true; 
    } 

    //the view will register to this event when the DataContext is set 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

, a następnie w konstruktorze kodzie opóźnieniem za:

public CardsListView() 
{ 
    InitializeComponent(); 
    BindingContext = new CardsListViewModel(); 
} 

Po to, aby wyjaśnić, DataContext spływa kaskadowo wzdłuż drzewa wizualnego, dzięki czemu kontrolka ActivityIndicator będzie mogła odczytać właściwości określone w powiązaniach.

EDIT: Xamarin.Forms (i Silverlight/WPF etc ... przepraszam, to było jakiś czas!) Zapewnia również SetBinding metody (patrz Wiązanie danych rozdział).

+1

'Xamarin.Forms'' BindableObject's nie ma właściwości 'DataContext', ale' BindingContext' –

+0

Dzięki za informację! –

Powiązane problemy