2012-01-17 9 views
0

私はリボンにコピーボタンがあり、どのコントロールがフォーカスされているかを判断する必要があるので、呼び出すCopyメソッドを知っている必要があります。これを行う方法に関するアイデア?私はFocusManager.GetFocusedElementを考えていましたが、MVVMを使用しているので、何を引数として渡すべきかわかりません。何をコピーするかを知るために焦点を合わせる

private void Copy() 
    { 
     if (**Here_I_need_to_know_what_is_focused** is DataGridCell) 
     { 
      ApplicationCommands.Copy.Execute(null, this.DisplayedData); 
     } 
     else if ((this.CurrentFiles.SelectedItem is DSViewModel) || (this.CurrentFiles.SelectedItem is QViewModel)) 
     { 
      this.CurrentFiles.Copy(this.CurrentFiles.SelectedItem); 
     } 
     else 
     { 
      ApplicationCommands.Copy.Execute(null, Keyboard.FocusedElement); 
     } 
    } 
+1

これはMVVMではありません。 ICommandを公開し、コピーする必要のあるものをコマンドパラメータとして渡す必要があります。 – Will

+0

はい、私はビューがバインドするICommandを公開します。これは、ICommandによって呼び出されるメソッドです。 – KrisTrip

答えて

0

本当にコードがどこにあるかによって異なります。

ビューモデル内にあると仮定します。この場合、直接FocusMangagerにアクセスすることはできません。現在フォーカスされている要素を取得するには、CommandParameter属性を使用して関数に渡す必要があります。これは、可能なターゲットオブジェクトが1つしかない場合にバインドすることによって実行できます。

しかし、リボンのコピーボタンが複数のオブジェクトを処理する可能性が高いため、これはオプションではない可能性があります。この場合、私はCommand属性とCommandParameter属性を使用しませんが、コードの後ろにクリックハンドラを実装します。

ここで、FocusManagerを含むすべてのビューの機能を使用して、フォーカスされた要素または他のターゲットオブジェクトを決定するオプションがあります。ターゲットを決定したら、コマンドのExecuteメソッドを呼び出すことで、正しいオブジェクトをパラメータとして渡すことができます。

フォーカス要素を取得する前に、CanExecuteメソッドにクエリを実行して、コマンドを実行できる場合にのみターゲットオブジェクトを特定するようにしてください。 CanExecuteメソッドの結果に基づいてコピーボタンを有効/無効にする場合は、追加の作業が必要です。

注:This postDataGridとフォーカスマネージャを使用していくつかの問題があるかもしれないことを示唆しています。

関連する問題