データグリッドの左上にある [すべて選択] ボタンに機能を追加して、すべての行の選択を解除できるかどうかを知りたいですか? これを行うボタンにアタッチされたメソッドがありますが、ビューの同じ部分で機能を維持するために、[すべて選択] ボタンからこのメソッドを起動できれば素晴らしいと思います。この「すべて選択」ボタンにコードを追加できますか? もしそうなら、どのようにしてボタンにアクセスできますか? 例や提案を見つけることができませんでした。
質問する
11662 次
2 に答える
13
多くの検索を行った後、Colin Eberhardt からボタンにアクセスする方法を見つけました。
ビヘイビアーが添付されたコントロール テンプレートで到達しにくい要素のスタイルを設定する
次に、彼のクラスの「Grid_Loaded」メソッドを拡張してイベント ハンドラーをボタンに追加しましたが、最初にデフォルトの「すべて選択」コマンドを削除することを忘れないでください (そうしないと、追加したイベント ハンドラーを実行した後にコマンドが実行されます)。
/// <summary>
/// Handles the DataGrid's Loaded event.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event args.</param>
private static void Grid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid grid = sender as DataGrid;
DependencyObject dep = grid;
// Navigate down the visual tree to the button
while (!(dep is Button))
{
dep = VisualTreeHelper.GetChild(dep, 0);
}
Button button = dep as Button;
// apply our new template
ControlTemplate template = GetSelectAllButtonTemplate(grid);
button.Template = template;
button.Command = null;
button.Click += new RoutedEventHandler(SelectAllClicked);
}
/// <summary>
/// Handles the DataGrid's select all button's click event.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event args.</param>
private static void SelectAllClicked(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
DependencyObject dep = button;
// Navigate up the visual tree to the grid
while (!(dep is DataGrid))
{
dep = VisualTreeHelper.GetParent(dep);
}
DataGrid grid = dep as DataGrid;
if (grid.SelectedItems.Count < grid.Items.Count)
{
grid.SelectAll();
}
else
{
grid.UnselectAll();
}
e.Handled = true;
}
基本的に、行が選択されていない場合は「すべてを選択」し、そうでない場合は「すべてを選択解除」します。すべて選択/選択解除が機能することを期待するのとほとんど同じように機能します。正直に言うと、おそらく次のリリースで、コマンドにデフォルトでこれを実行させなかったとは信じられません。
とにかくこれが誰かに役立つことを願っています、乾杯、ウィル
于 2009-09-30T16:38:55.403 に答える
2
selectall イベントを処理するコマンドバインディングを追加できます。
于 2014-02-19T13:02:12.833 に答える