3

MVVMアプリケーションにデータグリッドがあります。クライアントがデータを表示する方法のため、テンプレート列を使用する必要があります。ただし、一般的なデータ入力機能が必要です(Enterキーを押すとデータチェックが実行され、有効な場合は行がコミットされ、次の行の最初のテキストボックスにフォーカスされます。Tabキーを押すと次のテキストボックスにフォーカスされます...)。また、データは外部ソースからグリッドにインポートされることが多く、通常は一度に数千のレコードがインポートされます。

現在、新しい行が追加された後にフォーカスを設定するために使用している各テキストボックスにLoadedイベントが接続されています。私の問題は、多くの行をインポートするとグリッドが混乱することです。ユーザーがスクロールすると、Loadedイベントが発生し、グリッドは基本的に使用できなくなります。これを防ぐために仮想化を無効にしましたが、特定の構成でグリッドが1ギガのRAMを使用していることがわかりましたが、これは許容できません。大量のメモリを使用せずに、このグリッドを必要な方法で機能させる方法を理解することはできません。新しく追加された行内でテキストボックスにフォーカスできるようにする必要があるように見えますが、データ検証はビューモデルで実行されるため、コードビハインドの新しい行にアクセスできないため、 「newtextbox.focus()」などを呼び出します。私はここでかなり必死になっています、

4

1 に答える 1

2

newtextbox.focus()(およびその他のやりたいこと)を呼び出すことができるイベントリスナーをコードビハインドに配置します。ビューモデルの検証で、グリッドに実行させたいことを示す引数を使用してイベントを発生させます。

編集:OK、新しいアプローチ。キーストロークをトラップしてみてください。EnterキーまたはTabキーを押して、やりたいことを実行してください。

これはあなたのxamlにあります

<Grid  KeyUp="myDataGrid_KeyUp" >

これはあなたのコードビハインドに入るでしょう

    private void myDataGrid_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // do your enter stuff here, manipulate the view model for validation, etc.
        }
        else if (e.Key == Key.Tab)
        {
            // do your tab stuff here (get selected row, determine cell focus, focus on next cell)
        }
    }
于 2011-08-02T17:02:31.943 に答える