我需要在用户点击时折叠WPF DataGrid的详细行,并在再次单击时重新显示它。同时,我还想保留DataGridRoDetailsVisibilityMode为VisibleWhenSelected,使用单选。
基于别处发布的帖子,我想到了这个解决方案:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0a45b3a7-46d0-45a9-84b2-0062f07f6fec#eadc8f65-fcc6-41df-9ab9-8d93993e114c
这似乎很好地解决了我的问题,但我有一种不安的感觉,认为这可以更简单和优雅地完成,特别是因为我在此项目中使用了MVVM。但是,我认为这是事件驱动代码后台的可接受用法,因为它纯粹是表示逻辑。
有没有更简洁的解决方案?
基于别处发布的帖子,我想到了这个解决方案:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0a45b3a7-46d0-45a9-84b2-0062f07f6fec#eadc8f65-fcc6-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。但是,我认为这是事件驱动代码后台的可接受用法,因为它纯粹是表示逻辑。
有没有更简洁的解决方案?
System.Windows.Controls
,其中包括DataGridRowDetailsVisibilityMode
。 - Jinjinov