2016-03-21 15 views
0

Stephenの非同期UIについては、this great articleに従っていますが、残念ながら、CommandManagerクラスは使用できないため、これはUniversal Windows Appsには適用されません。UWAの非同期UIパターン

この制限を回避するにはどうすればよいですか?

これは、非同期コマンドの基本型です:あなたは多くのコマンドが登録されていたときに、それがパフォーマンスに影響がありますのため

public abstract class AsyncCommandBase : IAsyncCommand 
{ 
    public abstract bool CanExecute(object parameter); 
    public abstract Task ExecuteAsync(object parameter); 
    public async void Execute(object parameter) 
    { 
    await ExecuteAsync(parameter); 
    } 
    public event EventHandler CanExecuteChanged 
{ 
add { CommandManager.RequerySuggested += value; } 
remove { CommandManager.RequerySuggested -= value; } 
} 
    protected void RaiseCanExecuteChanged() 
{ 
CommandManager.InvalidateRequerySuggested(); 
} 
} 
+0

複雑なアプリケーションで多くのコマンドを使用すると、「CommandManager」を使用するこの「パターン」は恐ろしいものですが、** ALL **コマンドがそれらのCanExecuteメソッドを再評価するため、パフォーマンスに重大な影響を与えます – Tseng

答えて

1

コメントで指摘したように、この「パターン」を使用すべきではありません。

CommandManager.InvalidateRequerySuggested()を呼び出すと、WPFは登録されたすべてのコマンドを検証し、そのメソッドはCanExecute(...)になります。

代わりに、単にイベントを宣言し、唯一のあなたはまだちょうどcommand.RaiseCanExecuteChanged();を使用するコマンドを無効にしたい場合は常にWPFはそれ

public abstract class AsyncCommandBase : IAsyncCommand 
{ 
    ... 
    public event EventHandler CanExecuteChanged; 
    public void RaiseCanExecuteChanged() 
    { 
     // C# 6.0, otherwise assign the handler to variable and do null check 
     CanExecuteChanged?.Invoke(this, EventArgs.Empty); 
    } 
    ... 
} 

に登録してみましょう。複数のコマンドの再検証を開始するには、自分で管理する必要があります(つまり、コマンドをグループに登録する場合はCompoundCommandなど)。