Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序运行时加载程序未触发_C#_.net_Wpf_Mvvm - Fatal编程技术网

C# 应用程序运行时加载程序未触发

C# 应用程序运行时加载程序未触发,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我是WPF新手,正在构建一个应用程序,使用Mahapps ProgressRing控件在登录过程和后续数据检索期间显示加载动画 我的问题是,无论我尝试什么,加载程序都不会显示 My ViewModel具有绑定ProgressRing IsActive标志的属性: private bool loaderActive; public bool LoaderActive { get { return loaderActive; } set

我是WPF新手,正在构建一个应用程序,使用Mahapps ProgressRing控件在登录过程和后续数据检索期间显示加载动画

我的问题是,无论我尝试什么,加载程序都不会显示

My ViewModel具有绑定ProgressRing IsActive标志的属性:

private bool loaderActive;
    public bool LoaderActive
    {
        get { return loaderActive; }
        set
        {
            loaderActive = value;
            RaisePropertyChangedEvent("LoaderActive");
        }
    }
视图中的XAML控件:

<Controls:ProgressRing IsActive="{Binding LoaderActive}" Panel.ZIndex="1"/>
该方法激发并调用DoWork零件:

private void BwLogin_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(5000); // making sure this takes longer
        var token = ServerDataRepo.GetAuthorizationToken(userName, password);

        if (!string.IsNullOrEmpty(token.Token))
        {
            GetServerList(token.Token);
        }
    }
最后,我在另一个事件中禁用加载程序:

private void BwLogin_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        loaderActive = false;
    }
我的ViewModel继承自:

public abstract class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChangedEvent(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
加载器没有显示应该显示的时间。我在XAML中尝试了双向绑定,无论如何这是不必要的,尝试了使用异步任务方法(而不是BackgroundWorker)将进程卸载到另一个线程,尝试了启用loader loaderActive=true;在ViewModel构造函数中,为了确保它实际工作,它确实工作,因此绑定工作

我还尝试用一个简单的TextBLock替换该控件,将其文本值绑定到ViewModel属性,然后以类似的方式填充该属性,但也没有显示

UI线程未锁定-我已检查。据我所知,我正在UI线程中设置loaderActive属性——除此之外,我没有在其他任何地方使用BackgroundWorker


如有任何见解,将不胜感激。

elgonzo提供的解决方案:


请注意,属性设置器仅在向属性赋值期间执行。直接对属性的backing字段进行赋值不会自然执行属性setter,因为如果直接操作字段,则不涉及属性本身。如果未执行属性设置器,则不会引发PropertyChangedEvent,因此绑定不会更新ProgressRing.IsActive…–埃尔贡佐


更改了对属性bool LoaderActive的赋值,该操作正常。

请注意,只有在将值赋值给属性时,才会执行属性设置程序。直接对属性的backing字段进行赋值不会自然执行属性setter,因为如果直接操作字段,则不涉及属性本身。如果未执行属性设置程序,则不会引发PropertyChangedEvent,因此绑定不会更新ProgressRing.IsActive…@elgonzo,这是它完成的。。感觉自己像个十足的傻瓜。谢谢顺便说一句,由于很容易忽略LoaderActive和LoaderActive之间的细微差别,因此通常建议将字段名与其关联的属性名在视觉上更为明显,例如_LoaderActive或loaderActiveBackingField。当您有意或无意地访问备份字段以及访问属性时,这将使其一眼就能看得更清楚。。。
public abstract class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChangedEvent(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}