xamarin.从xaml到性质的结合形式

本文关键字:结合 xaml xamarin | 更新日期: 2023-09-27 18:22:47

我是一个使用xaml绑定的新手,有时我真的不懂。

我的xaml:中有这个

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

绑定"IsLoading"。我在哪里声明/设置此属性?!

我的.cs看起来像这样:

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

xamarin.从xaml到性质的结合形式

绑定通常从BindingContext属性解析(在其他实现中,此属性称为DataContext)。默认情况下,这是null(至少在XAML的其他实现中是这样),因此您的视图无法找到指定的属性。

在您的情况下,必须将BindingContext属性设置为this:

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

然而,仅凭这一点是不够的。您当前的解决方案没有实现向视图通知任何属性更改的机制,因此您的视图必须实现INotifyPropertyChanged。相反,我建议您实现Model-View-ViewModel模式,它不仅非常适合数据绑定,而且会产生更可维护和可测试的代码库:

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

然后在代码背后的构造函数中:

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

为了澄清,DataContext级联到可视化树中,因此ActivityIndicator控件将能够读取绑定中指定的属性。

编辑:Xamarin.Forms(以及Silverlight/WPF等…抱歉,已经有一段时间了!)还提供了SetBinding方法(请参阅数据绑定部分)。