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

おそらく、そのようなロジックをメソッドに移動する必要があります。プロパティの使用に関するガイドラインに違反しています。

この操作は、フィールド セットよりも桁違いに遅くなります。スレッドのブロックを回避するために操作の非同期バージョンを提供することを検討している場合でも、操作がプロパティになるにはコストが高すぎる可能性が非常に高くなります。特に、ネットワークまたはファイル システムにアクセスする操作(初期化のための 1 回以外) は、ほとんどの場合、プロパティではなくメソッドにする必要があります。

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

編集:私はWPFの経験があまりありませんが、これはプロパティではなくメソッドにバインドする方法かもしれないと思います:

データグリッド WPF の列へのメソッドのバインド

于 2013-10-23T19:15:27.097 に答える