与 WPF 属性异步

本文关键字:异步 属性 WPF | 更新日期: 2023-09-27 18:36:40

我有一个这样的绑定属性:

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

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

编辑:不止一个人说不要使用房产,所以我想大声疾呼。我正在使用 WPF,此属性绑定到 UI。我必须使用一个属性。

与 WPF 属性异步

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

您可以在加载时使用单独的属性来禁用 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 反映操作正在运行(异步)并显示进度等。

也许你应该把这种逻辑移到一个方法上。您违反了使用属性的准则:

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

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

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

将方法绑定到数据网格 WPF 中的列