与WPF属性异步

时间:2013-10-23 19:12:38

标签: c# wpf async-await

我有这样的绑定属性:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _mypath = value;
        NotifyPropertyChanged(() => MyPath);
        LoadSomeStuffFromMyPath(mypath)
    }
}

我想让make LoadSomeStuffFromMyPath异步,但我无法等待来自属性。有一种简单的方法可以做到这一点吗?

编辑:不止一个人说不要使用房产,所以我想把它叫出来。我正在使用WPF,这个属性绑定到UI。我必须使用一个属性。

2 个答案:

答案 0 :(得分:9)

由于您希望在完成操作之前强制操作不继续,因此我建议您使用方法来处理加载和显示进度。

您可以使用单独的属性来加载UI,这可以有效地“阻止”您的用户,直到操作完成:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _myPath = value;
        NotifyPropertyChanged(() => MyPath);
        UpdateMyPathAsync();
    }
}

public async Task UpdateMyPathAsync()
{
    this.EnableUI = false; // Stop user from setting path again....
    await LoadSomeStuffFromMyPathAsync(MyPath); 
    this.EnableUI = true;
}

这允许您像往常一样使用WPF绑定,但让您的UI反映操作正在运行(异步)并显示进度等。

答案 1 :(得分:0)

也许您应该将这种逻辑移到方法中。您违反了使用属性的准则:

  

操作比字段集慢几个数量级。   如果你甚至考虑提供一个异步版本   操作,以避免阻塞线程,很可能是   操作太昂贵,不能成为财产。特别是运营   访问网络或文件系统(除了一次   初始化)应该很可能是方法,而不是属性。

http://msdn.microsoft.com/en-us/library/vstudio/ms229054(v=vs.100).aspx

修改: 我对WPF不是很有经验,但我认为这可能是一种绑定方法而不是属性的方法:

Binding a method to a column in datagrid WPF