C# 应用程序运行时加载程序未触发
我是WPF新手,正在构建一个应用程序,使用Mahapps ProgressRing控件在登录过程和后续数据检索期间显示加载动画 我的问题是,无论我尝试什么,加载程序都不会显示 My ViewModel具有绑定ProgressRing IsActive标志的属性: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
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));
}
}