ユーザーがクリックしたときに WPF DataGrid の詳細行を折りたたみ、もう一度クリックしたときに再表示する必要がありました。また、単一選択を使用して、VisibleWhenSelected の DataGridRoDetailsVisibilityMode を保持したいと考えました。
他の場所でのこの投稿に基づいて、このソリューションを思いつきました: 41df-9ab9-8d93993e114c
private bool _rowSelectionChanged;
private void dgCompletedJobs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_rowSelectionChanged = true;
}
private void dgCompletedJobsMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
//navigate up the tree
while (dep != null &&
!(dep is DataGridCell) &&
!(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
{
return;
}
DataGridCell dgc = dep as DataGridCell;
if (dgc != null)
{
//navigate further up the tree
while (dep != null && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
DataGridRow dgr = dep as DataGridRow;
DataGrid dg = sender as DataGrid;
if (dg != null && dgr != null)
{
if (dgr.IsSelected && !_rowSelectionChanged)
{
dg.RowDetailsVisibilityMode =
(dg.RowDetailsVisibilityMode == DataGridRowDetailsVisibilityMode.VisibleWhenSelected)
? DataGridRowDetailsVisibilityMode.Collapsed
: DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
}
else
{
dg.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
}
}
}
_rowSelectionChanged = false;
}
これは私の問題をうまく解決しているように見えますが、特にこのプロジェクトで MVVM を使用しているため、これをより簡単かつエレガントに行うことができるのではないかと思います。ただし、これは純粋にプレゼンテーション ロジックであるため、イベント ドリブンのコード ビハインドの許容可能な使用法と考えています。
誰もがよりクリーンなソリューションを持っていますか?