C# 单击DataGridRow时在隐藏和显示行详细信息之间切换
我有一个DataGrid,它将RowDetailsVisibilityMode设置为“VisibleWhenSelected”,以便在选择特定行时显示RowDetailsTemplate。我希望在再次单击行时能够切换RowDetails可见性。默认情况下,只要选定了行详细信息,就可以看到该行详细信息,但如果再次单击该行,我希望基本上“取消选择”该行 在尝试了很多东西之后,我找到了一种古怪的解决方案,它至少可以让我在单击行时切换可见性:C# 单击DataGridRow时在隐藏和显示行详细信息之间切换,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个DataGrid,它将RowDetailsVisibilityMode设置为“VisibleWhenSelected”,以便在选择特定行时显示RowDetailsTemplate。我希望在再次单击行时能够切换RowDetails可见性。默认情况下,只要选定了行详细信息,就可以看到该行详细信息,但如果再次单击该行,我希望基本上“取消选择”该行 在尝试了很多东西之后,我找到了一种古怪的解决方案,它至少可以让我在单击行时切换可见性: private async void DataGrid_Pr
private async void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
await Task.Delay(1); //ensures DataGrid.SelectedIndex is what I just clicked, not the previous value
if (DataGrid.SelectedIndex == prevSelectedIndex) { //check if I'm clicking on what's already selected
DataGrid.SelectedIndex = -1; //collapses everything
}
prevSelectedIndex = DataGrid.SelectedIndex; //save current selected index
}
延迟确保在检查所选索引时已更新SelectedIndex属性。我希望我不必使用它——我会很高兴找到更好的解决方案
但是,现在的问题是,每当我单击所选行的RowDetails中的任何内容时,就会触发此事件,并且行详细信息再次消失。我希望能够以某种方式检查我仅在单击行本身时才展开/折叠行,而不是在单击RowDetailsTemplate中的任何内容时。可能吗?我不想为每一行使用额外的扩展按钮。我认为全局布尔变量可以为您进行切换
public bool Visible = false;
private async void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (Visible == false)
{
await Task.Delay(1); //ensures DataGrid.SelectedIndex is what I just clicked, not the previous value
if (DataGrid.SelectedIndex == prevSelectedIndex)
{ //check if I'm clicking on what's already selected
DataGrid.SelectedIndex = 1; //collapses everything
}
prevSelectedIndex = DataGrid.SelectedIndex; //save current selected index
Visible = true;
}
else
{
await Task.Delay(1); //ensures DataGrid.SelectedIndex is what I just clicked, not the previous value
if (DataGrid.SelectedIndex == prevSelectedIndex)
{ //check if I'm clicking on what's already selected
DataGrid.SelectedIndex = -1; //collapses everything
}
prevSelectedIndex = DataGrid.SelectedIndex; //save current selected index
Visible = false;
}
}
我认为一个全局布尔变量可以为您进行切换
public bool Visible = false;
private async void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (Visible == false)
{
await Task.Delay(1); //ensures DataGrid.SelectedIndex is what I just clicked, not the previous value
if (DataGrid.SelectedIndex == prevSelectedIndex)
{ //check if I'm clicking on what's already selected
DataGrid.SelectedIndex = 1; //collapses everything
}
prevSelectedIndex = DataGrid.SelectedIndex; //save current selected index
Visible = true;
}
else
{
await Task.Delay(1); //ensures DataGrid.SelectedIndex is what I just clicked, not the previous value
if (DataGrid.SelectedIndex == prevSelectedIndex)
{ //check if I'm clicking on what's already selected
DataGrid.SelectedIndex = -1; //collapses everything
}
prevSelectedIndex = DataGrid.SelectedIndex; //save current selected index
Visible = false;
}
}
我找到了解决问题的方法: 在ContentControl下的RowDetailsTemplate中,我添加了一个捕获PreviewMouseDown事件的EventSetter:
<EventSetter Event="PreviewMouseDown" Handler="ContentControl_PreviewMouseDown" />
最后,在我的原始代码中,我只是检查我是否单击了ContentControl,或者它是否是其他内容,在本例中,这意味着它是行本身:
private async void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ClickedRowDetails = false; //default assume that we haven't clicked row details
await Task.Delay(1); //wait for other events to fire
if (!ClickedRowDetails) {
if (DataGrid.SelectedIndex == prevSelectedIndex )
{
DataGrid.SelectedIndex = -1;
}
prevSelectedIndex = DataGrid.SelectedIndex;
}
}
现在,我只需单击行,就可以成功地展开/折叠行,然后可以操作RowDetailsTemplate中的任何内容,而不会意外地折叠行。这是在没有扩展器按钮的情况下完成的。我找到了解决问题的方法: 在ContentControl下的RowDetailsTemplate中,我添加了一个捕获PreviewMouseDown事件的EventSetter:
<EventSetter Event="PreviewMouseDown" Handler="ContentControl_PreviewMouseDown" />
最后,在我的原始代码中,我只是检查我是否单击了ContentControl,或者它是否是其他内容,在本例中,这意味着它是行本身:
private async void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ClickedRowDetails = false; //default assume that we haven't clicked row details
await Task.Delay(1); //wait for other events to fire
if (!ClickedRowDetails) {
if (DataGrid.SelectedIndex == prevSelectedIndex )
{
DataGrid.SelectedIndex = -1;
}
prevSelectedIndex = DataGrid.SelectedIndex;
}
}
现在,我只需单击行,就可以成功地展开/折叠行,然后可以操作RowDetailsTemplate中的任何内容,而不会意外地折叠行。这是在没有扩展器按钮的情况下完成的。可能重复感谢您的回复。问题:这难道不需要在单独的列中使用一个按钮来折叠/展开吗?当我只单击行本身时,是否可以实现类似的功能?但这可能需要更多的工作。单击时是否可以将行模板重新写入弹出详细信息?然后,当你点击关闭它就会消失。除非您绝对需要RowDetailsTemplate中的信息,否则是否有其他选择?如果我无法实现此功能,将来可能会有其他选择,但至少目前与我一起工作的客户希望按照描述完成此操作。很遗憾,可能是重复的。感谢您的回复。问题:这难道不需要在单独的列中使用一个按钮来折叠/展开吗?当我只单击行本身时,是否可以实现类似的功能?但这可能需要更多的工作。单击时是否可以将行模板重新写入弹出详细信息?然后,当你点击关闭它就会消失。除非您绝对需要RowDetailsTemplate中的信息,否则是否可能有其他方法?如果我无法实现此功能,将来可能会有其他方法,但至少目前与我一起工作的客户希望按照描述的方式完成。非常遗憾,感谢您的回复。我可以让我的datagrid切换,但目前的主要问题是,我希望它仅在单击行本身时切换,而不是在单击下面的行详细信息时切换。感谢您的回复。我可以让datagrid进行切换,但目前的主要问题是,我希望它仅在单击行本身时进行切换,而不是在单击下面的行详细信息时进行切换。