除非与异步代码一起使用,否则WPF绑定不起作用
我有一个标签,其内容属性绑定到ViewModel(Prism/MVVM)上的字符串。当我运行这个方法,将“pending”赋值给那个字符串时,值会改变,但视图永远不会更新。不过,它在第二次任务(“成功”)时会更新。 我胡乱地试图用RaisePropertyChanged强制更新,但没有成功,然后尝试异步运行部分代码。成功了!?!-但我不知道为什么。对这个问题有什么看法吗?没有异步解决方案的任何补救措施 XAML: 方法异步:除非与异步代码一起使用,否则WPF绑定不起作用,wpf,asynchronous,binding,Wpf,Asynchronous,Binding,我有一个标签,其内容属性绑定到ViewModel(Prism/MVVM)上的字符串。当我运行这个方法,将“pending”赋值给那个字符串时,值会改变,但视图永远不会更新。不过,它在第二次任务(“成功”)时会更新。 我胡乱地试图用RaisePropertyChanged强制更新,但没有成功,然后尝试异步运行部分代码。成功了!?!-但我不知道为什么。对这个问题有什么看法吗?没有异步解决方案的任何补救措施 XAML: 方法异步: private async void DbaseCreate() {
private async void DbaseCreate()
{
DbaseCreateSuccess = "pending";
string[] files = Directory.GetFiles("Scripts", "*.*", SearchOption.AllDirectories);
String databaseName = "testbase";
String databaseScript = "testbase.sql";
int fileCount = 0;
await Task.Factory.StartNew(() =>
{
foreach (String file in files)
{
if (file.Contains(databaseScript))
{
DataService.Runscript(file);
}
}
foreach (String file in files)
{
FileInfo info = new FileInfo(file);
Trace.WriteLine("FileExtension: " + info.Extension);
if (info.Extension == ".sql" && !file.Contains(databaseScript))
{
++fileCount;
DataService.Runscript(file, databaseName);
}
}
});
if (DataService.GetTableNames(databaseName).Count == fileCount)
{
DbaseCreateSuccess = "success";
}
}
视图模型:
public class DatabaseAdminViewModel : BindableBase
{
private readonly IUnityContainer _container;
private readonly IRegionManager _regionManager;
private String _DbaseCreateSuccess;
public String DbaseCreateSuccess { get { return _DbaseCreateSuccess; } set { SetProperty(ref _DbaseCreateSuccess, value, "DbaseCreateSuccess"); } }
public DelegateCommand DbaseCreateCommand { get; set; }
public DatabaseAdminViewModel(IUnityContainer container, IRegionManager regionManager)
{
_regionManager = regionManager;
_container = container;
DbaseCreateSuccess = "idle";
DbaseCreateCommand = new DelegateCommand(DbaseCreate);
}
private async void DbaseCreate()
{
DbaseCreateSuccess = "pending";
string[] files = Directory.GetFiles("Scripts", "*.*", SearchOption.AllDirectories);
String databaseName = "testbase";
String databaseScript = "testbase.sql";
int fileCount = 0;
await Task.Factory.StartNew(() =>
{
foreach (String file in files)
{
if (file.Contains(databaseScript))
{
DataService.Runscript(file);
}
}
foreach (String file in files)
{
FileInfo info = new FileInfo(file);
Trace.WriteLine("FileExtension: " + info.Extension);
if (info.Extension == ".sql" && !file.Contains(databaseScript))
{
++fileCount;
DataService.Runscript(file, databaseName);
}
}
});
if (DataService.GetTableNames(databaseName).Count == fileCount)
{
DbaseCreateSuccess = "success";
}
}
}
你能分享你的viewmodel吗?关于这个问题有什么建议吗在UI线程中执行长时间运行的db操作并阻塞UI。没有异步解决方案的任何补救措施那么,在代码继续执行之前,视图更改的触发不会发生吗?
private async void DbaseCreate()
{
DbaseCreateSuccess = "pending";
string[] files = Directory.GetFiles("Scripts", "*.*", SearchOption.AllDirectories);
String databaseName = "testbase";
String databaseScript = "testbase.sql";
int fileCount = 0;
await Task.Factory.StartNew(() =>
{
foreach (String file in files)
{
if (file.Contains(databaseScript))
{
DataService.Runscript(file);
}
}
foreach (String file in files)
{
FileInfo info = new FileInfo(file);
Trace.WriteLine("FileExtension: " + info.Extension);
if (info.Extension == ".sql" && !file.Contains(databaseScript))
{
++fileCount;
DataService.Runscript(file, databaseName);
}
}
});
if (DataService.GetTableNames(databaseName).Count == fileCount)
{
DbaseCreateSuccess = "success";
}
}
public class DatabaseAdminViewModel : BindableBase
{
private readonly IUnityContainer _container;
private readonly IRegionManager _regionManager;
private String _DbaseCreateSuccess;
public String DbaseCreateSuccess { get { return _DbaseCreateSuccess; } set { SetProperty(ref _DbaseCreateSuccess, value, "DbaseCreateSuccess"); } }
public DelegateCommand DbaseCreateCommand { get; set; }
public DatabaseAdminViewModel(IUnityContainer container, IRegionManager regionManager)
{
_regionManager = regionManager;
_container = container;
DbaseCreateSuccess = "idle";
DbaseCreateCommand = new DelegateCommand(DbaseCreate);
}
private async void DbaseCreate()
{
DbaseCreateSuccess = "pending";
string[] files = Directory.GetFiles("Scripts", "*.*", SearchOption.AllDirectories);
String databaseName = "testbase";
String databaseScript = "testbase.sql";
int fileCount = 0;
await Task.Factory.StartNew(() =>
{
foreach (String file in files)
{
if (file.Contains(databaseScript))
{
DataService.Runscript(file);
}
}
foreach (String file in files)
{
FileInfo info = new FileInfo(file);
Trace.WriteLine("FileExtension: " + info.Extension);
if (info.Extension == ".sql" && !file.Contains(databaseScript))
{
++fileCount;
DataService.Runscript(file, databaseName);
}
}
});
if (DataService.GetTableNames(databaseName).Count == fileCount)
{
DbaseCreateSuccess = "success";
}
}
}