除非与异步代码一起使用,否则WPF绑定不起作用

除非与异步代码一起使用,否则WPF绑定不起作用,wpf,asynchronous,binding,Wpf,Asynchronous,Binding,我有一个标签,其内容属性绑定到ViewModel(Prism/MVVM)上的字符串。当我运行这个方法,将“pending”赋值给那个字符串时,值会改变,但视图永远不会更新。不过,它在第二次任务(“成功”)时会更新。 我胡乱地试图用RaisePropertyChanged强制更新,但没有成功,然后尝试异步运行部分代码。成功了!?!-但我不知道为什么。对这个问题有什么看法吗?没有异步解决方案的任何补救措施 XAML: 方法异步: private async void DbaseCreate() {

我有一个标签,其内容属性绑定到ViewModel(Prism/MVVM)上的字符串。当我运行这个方法,将“pending”赋值给那个字符串时,值会改变,但视图永远不会更新。不过,它在第二次任务(“成功”)时会更新。 我胡乱地试图用RaisePropertyChanged强制更新,但没有成功,然后尝试异步运行部分代码。成功了!?!-但我不知道为什么。对这个问题有什么看法吗?没有异步解决方案的任何补救措施

XAML:

方法异步:

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";
        }
    }
}