2014-09-18 20 views
11

Tôi là một tổng newbie với bindings trong xaml và tôi thực sự không nhận được nó đôi khi.xamarin.forms ràng buộc từ xaml đến bất động sản

Tôi có điều này trong XAML của tôi:

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

Các ràng buộc "IsLoading". Tôi khai báo/đặt thuộc tính này ở đâu?

cs của tôi trông như thế này:

.... 
    public bool IsLoading; 

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

Trả lời

12

Bindings thường được giải quyết từ BindingContext tài sản (trong việc triển khai khác, khách sạn này được gọi là DataContext). Đây là null theo mặc định (ít nhất là trong các triển khai khác của XAML), do đó chế độ xem của bạn không thể tìm thấy các thuộc tính được chỉ định.

Trong trường hợp của bạn, bạn phải thiết lập các BindingContext tài sản để this:

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

Tuy nhiên, điều này không thôi sẽ không đủ. Giải pháp hiện tại của bạn không triển khai cơ chế thông báo cho chế độ xem về bất kỳ thay đổi thuộc tính nào, vì vậy, chế độ xem của bạn sẽ phải triển khai INotifyPropertyChanged. Thay vào đó, tôi đề nghị bạn thực hiện mô hình Model-View-ViewModel, trong đó không chỉ phù hợp đẹp mắt với dữ liệu ràng buộc, nhưng sẽ dẫn đến một cơ sở mã dễ bảo trì hơn và kiểm chứng:

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

Và sau đó trong constructor code-behind của bạn:

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

Chỉ cần làm rõ, DataContext thác xuống cây thị giác, do đó điều khiển ActivityIndicator sẽ có thể đọc được các thuộc tính được chỉ định trong các kết buộc.

Chỉnh sửa: Xamarin.Forms (và Silverlight/WPF vv ... xin lỗi, đã lâu rồi!) Cũng cung cấp phương thức SetBinding (xem phần Dữ liệu ràng buộc).

+1

'Xamarin.Forms'' BindableObject 'không có thuộc tính' DataContext', nhưng 'BindingContext' –

+0

Cảm ơn bạn đã thông tin! –

Các vấn đề liên quan