C# xamarin.forms从xaml绑定到属性

C# xamarin.forms从xaml绑定到属性,c#,xaml,xamarin.forms,C#,Xaml,Xamarin.forms,我对xaml中的绑定完全是个新手,有时候我真的不懂 我的xaml中有以下内容: 绑定“IsLoading”。我在哪里声明/设置此属性 我的.cs如下所示: 。。。。 公共布尔孤岛; 公共卡slistxaml() { 初始化组件(); IsLoading=true; .... 绑定通常从BindingContext属性解析(在其他实现中,此属性称为DataContext)。默认情况下(至少在其他XAML实现中),此属性为null,因此您的视图无法找到指定的属性 在您的情况下,必须将Bindin

我对xaml中的绑定完全是个新手,有时候我真的不懂

我的xaml中有以下内容:


绑定“IsLoading”。我在哪里声明/设置此属性

我的.cs如下所示:

。。。。
公共布尔孤岛;
公共卡slistxaml()
{
初始化组件();
IsLoading=true;
....

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

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

public CardsListXaml()
{
    InitializeComponent();
    BindingContext = this;
    IsLoading = true;
}
但是,仅此一点是不够的。您当前的解决方案没有实现通知视图任何属性更改的机制,因此您的视图必须实现
INotifyPropertyChanged
。相反,我建议您实现该模式,它不仅非常适合数据绑定,而且将导致更易于维护的和可测试代码库:

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等…抱歉,已经有一段时间了!)还提供了一个方法(请参见数据绑定部分)。

Xamarin.Forms
BindableObject
没有
DataContext
属性,但有
BindingContext