Xamarin.forms 沙马林形式->;如果要执行语句的命令,则活动指示器不工作

Xamarin.forms 沙马林形式->;如果要执行语句的命令,则活动指示器不工作,xamarin.forms,visual-studio-2017,Xamarin.forms,Visual Studio 2017,使用Visual Studio 2017社区15.8.1 这是在检查了有关ActivityIndicator的stackoverflow的所有选项之后。因此,虽然这可能是一个重复,但没有什么是帮助我了。 所以最后决定发布我的训练,并从这里得到最好的帮助 我迄今为止所尝试的:- 1.{Binding IsLoading}+INotifyPropertyChanged+public void RaisePropertyChanged(string propName)+IsLoading=true;概

使用Visual Studio 2017社区15.8.1

这是在检查了有关ActivityIndicator的stackoverflow的所有选项之后。因此,虽然这可能是一个重复,但没有什么是帮助我了。 所以最后决定发布我的训练,并从这里得到最好的帮助

我迄今为止所尝试的:-
1.{Binding IsLoading}+INotifyPropertyChanged+public void RaisePropertyChanged(string propName)+IsLoading=true;概念。
2.ActivityIndicator_Busy.IsVisible=false;(直接控制访问)

这两种方法大部分都是推荐的,我在过去几周花了很多时间深入研究了每种方法。但什么都没有

我取得了什么成就?:-
ActivityIndicator_Busy.IsVisible=false;只有当我在执行语句之前输入return(用于测试目的)时,概念才能顺利工作;关于按钮单击事件的语句。(附图) 但一旦我删除返回;按下按钮,稍停片刻后,主页立即打开

我的问题:-
1.在当前场景中,当用户单击欢迎按钮时,如何立即运行ActivityIndicator是一个特殊的问题。
2.同样,当应用程序启动时,也会出现一个空白的白色屏幕,持续数秒,几乎30秒,我也想显示ActivityIndicator。但我不知道在哪种情况下该如何强加这种逻辑

我的输入

My MainPage.xaml文件:- (2018年9月6日晚上9:11编辑)



2018年10月4日
最终通过解决


更新2018-09-10 通过将
INotifyPropertyChanged
添加到类定义并添加事件,您认为您已经实现了
INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
以及它的事件invocator

public void RaisePropertyChanged(string propName)
{           
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}
无论如何,由于
ContentPage
已经实现了
INotifyPropertyChanged
,添加那些没有实现
INotifyPropertyChanged
ContentPage
已经定义了事件(或者更确切地说,
BindableObject
间接继承了该事件)。任何依赖于获得页面中属性更改的通知的对象都将订阅祖先的
PropertyChanged
事件,而不是您定义的
PropertyChanged
事件,因此
ActivityIndicator
不会更新

只需删除您定义的事件并调用
OnPropertyChanged
,而不是
RaisePropertyChanged()
,就可以了

private bool isLoading;

public bool IsLoading
{
    get
    {
        return isLoading;
    }

    set
    {
        isLoading = value;
        OnPropertyChanged();
    }
}
因为
OnPropertyChanged
被声明为

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
您不必手动传递属性名称。编译器将使用
CallerMemberNameAttribute
为您执行此操作

结束更新 XAML扩展
{Binding IsLoading}
ActivityIndicator
绑定到页面的
BindingContext
。默认情况下,
BindingContext
null
,因此没有任何可绑定的内容,您的所有努力都是徒劳的

使用viewmodel 首选的解决方案是使用viewmodel并将其分配给
MainPage.BindingContext
,例如

var page = new MainPage()
{
    BindingContext = new MainPageViewModel()
}
但是,如果您走这条路,您应该将所有UI逻辑移动到该viewmodel,并将SQL访问和业务逻辑封装在其他类中,以保持viewmodel与资源访问和业务逻辑的清洁。在代码中包含资源访问和逻辑可能适用于这个小示例,但可能会变成无法维护的混乱

没有视图模型 无论如何,您不必使用viewmodel来使用绑定。您可以为页面(或某些子页面)设置
BindingContext
,或使用
BindingExtension的
源代码

设置
BindingContext
BindingContext
从任何页面或视图传递到其子级。您首先必须使用
x:name=“page”
为页面命名(不必使用
page
,无论如何,您不能使用页面的类名),并将
BindingContext
设置为该页面

<ContentPage ...
    x:Name="Page"
    BindingContext="{x:Reference Page}"
    ...>
现在您可以在绑定中引用它

<ActivityIndicator 
    ...
    IsRunning="{Binding Path=IsLoading, Source={x:Reference Page}}" 
    IsVisible="{Binding Path=IsLoading, Source={x:Reference Page}}"/>

更新2018-09-10 通过将
INotifyPropertyChanged
添加到类定义并添加事件,您认为您已经实现了
INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
以及它的事件invocator

public void RaisePropertyChanged(string propName)
{           
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}
无论如何,由于
ContentPage
已经实现了
INotifyPropertyChanged
,添加那些没有实现
INotifyPropertyChanged
ContentPage
已经定义了事件(或者更确切地说,
BindableObject
间接继承了该事件)。任何依赖于获得页面中属性更改的通知的对象都将订阅祖先的
PropertyChanged
事件,而不是您定义的
PropertyChanged
事件,因此
ActivityIndicator
不会更新

只需删除您定义的事件并调用
OnPropertyChanged
,而不是
RaisePropertyChanged()
,就可以了

private bool isLoading;

public bool IsLoading
{
    get
    {
        return isLoading;
    }

    set
    {
        isLoading = value;
        OnPropertyChanged();
    }
}
因为
OnPropertyChanged
被声明为

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
您不必手动传递属性名称。编译器将使用
CallerMemberNameAttribute
为您执行此操作

结束更新 XAML扩展
{Binding IsLoading}
ActivityIndicator
绑定到页面的
BindingContext
。默认情况下,
BindingContext
null
,因此没有任何可绑定的内容,您的所有努力都是徒劳的

使用viewmodel 首选的解决方案是