我有一个DataGrid,它将RowDetailsVisibilityMode设置为"VisibleWhenSelected“,这样当我选择特定的行时,RowDetailsTemplate就会显示出来。我想要的是当我再次单击行时能够切换RowDetails可见性。默认情况下,只要RowDetails处于选中状态,它就是可见的,但如果再次单击它,我想从本质上“取消选择”选中的行。
在尝试了很多东西之后,我找到了一种奇怪的解决方案,至少可以让我在单击行时切换可见性:
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中的任何内容时展开/折叠行。这有可能吗?我不想为每行使用额外的Expander按钮。
发布于 2017-07-08 00:02:45
我找到了我的问题的解决方案:
在ContentControl下的RowDetailsTemplate中,我添加了一个捕获PreviewMouseDown事件的EventSetter:
<EventSetter Event="PreviewMouseDown" Handler="ContentControl_PreviewMouseDown" />该事件的处理程序设置了一个全局变量,该变量指示我是否已经单击了ContentControl中的内容:
private void ContentControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ClickedRowDetails = true;
}最后,在我的原始代码中,我只是简单地检查我是否单击了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中的任何内容,而不会意外地折叠行。这是在没有扩展按钮的情况下完成的。
发布于 2017-07-07 22:46:42
我认为全局布尔变量可以为您完成切换。
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;
}
}https://stackoverflow.com/questions/44973598
复制相似问题