7

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

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

我想要使​​ LoadSomeStuffFromMyPath 异步,但我不能等待属性。有没有一种简单的方法可以做到这一点?

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

4

2 回答 2

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 反映操作正在运行(异步)并显示进度等。

于 2013-10-23T19:15:17.850 回答
0

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

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

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

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

将方法绑定到datagrid WPF中的列

于 2013-10-23T19:15:27.097 回答