C# 当事件处理程序更新属性时,WPF绑定不起作用

C# 当事件处理程序更新属性时,WPF绑定不起作用,c#,wpf,mvvm,data-binding,inotifypropertychanged,C#,Wpf,Mvvm,Data Binding,Inotifypropertychanged,我正在使用WPF将我以前的一个玩具项目重新编写为MVVM结构。但绑定不起作用 我的项目将.xef文件转换为.mat文件。为了遵循MVVM结构,首先我创建了一个xef2matcore类来执行业务逻辑,并提供了几个事件(例如FileLoaded、ConversionProgressUpdated)。然后我创建了一个ViewModel类,其中存储了将绑定到UI的属性(例如Progress、IsButtionEnabled)。ViewModel实现了INotifyPropertyChanged接口。最后

我正在使用WPF将我以前的一个玩具项目重新编写为MVVM结构。但绑定不起作用

我的项目将.xef文件转换为.mat文件。为了遵循MVVM结构,首先我创建了一个xef2matcore类来执行业务逻辑,并提供了几个事件(例如FileLoaded、ConversionProgressUpdated)。然后我创建了一个ViewModel类,其中存储了将绑定到UI的属性(例如Progress、IsButtionEnabled)。ViewModel实现了INotifyPropertyChanged接口。最后,属性被绑定到UI元素(例如progressbar.Value、buttion.IsEnabled)

问题来了: 如果通过调用ViewModel中定义的方法直接更改绑定属性,则绑定工作正常。但是,如果通过事件处理程序方法更改绑定属性(并最终调用ViewModel中定义的相同方法),则绑定将无法工作(即使绑定属性值已更改,UI也不会更新)

代码说明如下:

public类ViewModel:observeObject
{
私人双(u)进程;;
公共双进步
{
获取=>\u进度;
set=>set(参考进度,值);
}
私有字符串\u文件名;
公共字符串文件名
{
get=>\u文件名;
set=>set(参考文件名,值);
}
私有布尔(U)按钮处于启用状态;
公共布尔值已禁用
{
get=>\u按钮已启用;
set=>set(参考按钮启用,值);
}
私人厕所很忙;
公共图书馆很忙
{
get=>\你很忙;
set=>set(ref\u isBusy,value);
}
Xef2核心XCore;
公共视图模型()
{
进度=0;
FileName=“”;
IsButtonneEnabled=真;
}
私有void XCore_FileLoaded()
{
IsButtonneEnabled=错误;
}
私有void XCore_ProgressUpdated(双进度)
{
进步=进步;
}
私有void XCore_ExportFinished()
{ 
IsButtonneEnabled=真;
进展=50;
}
public IAsyncCommand和SelectFileCommandAsync{get=>new AsyncCommand(UpdateFileSelectionExecuteAsync,CanFileSelectionExecute);}
私有布尔CanFileSelectionExecute()=>!正忙;
专用异步任务UpdateFileSelectionExecuteAsync()
{
var folder_path=Environment.CurrentDirectory;
如果(!Directory.Exists(folder_path))Directory.CreateDirectory(folder_path);
OpenFileDialog OpenFileDialog=新建OpenFileDialog();
openFileDialog.InitialDirectory=Environment.CurrentDirectory;
openFileDialog.Filter=“Kinect Studio数据文件|*.xef”;
openFileDialog.RestoreDirectory=true;
openFileDialog.FilterIndex=1;
var result=openFileDialog.ShowDialog();
if(result.HasValue&&result.Value)
{
FileName=openFileDialog.FileName;
IsBusy=true;
XCore=新的Xef2MatCore();
XCore.FileLoaded+=XCore\u FileLoaded;
XCore.ProgressUpdated+=XCore\u ProgressUpdated;
XCore.ExportFinished+=XCore\u ExportFinished;
//等待做你的工作;
等待XCore.LoadAsync(文件名);
IsBusy=false;
}
其他的
{
返回;
}
}
专用异步任务Do_work()
{
XCore_FileLoaded();
等待任务。运行(()=>
{
int i=0;
而(i<100)
{
XCore_(i++);
睡眠(100);
}                              
});
XCore_ExportFinished();
}
}
如果我取消注释
wait Do_work(),绑定就会工作但如果调用
wait XCore.LoadAsync(文件名)则不起作用(通过事件处理程序方法激发
XCore\u FileLoaded
XCore\u ProgressUpdated
XCore\u ExportFinished

XAML文件:



非常感谢您的帮助。

如前所述,当我调用
wait XCore.LoadAsync(文件名)时
,耗时的任务被阻止
oneventhapped
函数。然后将它们分开并将耗时的任务放到一个新线程中解决了问题。

也许
XCore.LoadAsync
不是真正的异步fx
{thread.Sleep(10000);return task.FromResult(1);}
谢谢你的评论,Selvin。但是我没有明白你的意思
{Thread.Sleep(10000);return Task.FromResult(1);}
。我应该试试这一行吗?这只是一个不允许do绑定的示例,因为即使您使用
wait
,主线程也会被阻塞。。。正如我所写的,也许XCore.LoadAsync不是真正的异步。您指的是什么绑定?在你的例子中没有。嗨,mm8,我已经修改了这个问题,包括了xaml文件的一部分供你参考。