Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击DataGridRow时在隐藏和显示行详细信息之间切换_C#_Wpf_Datagrid - Fatal编程技术网

C# 单击DataGridRow时在隐藏和显示行详细信息之间切换

C# 单击DataGridRow时在隐藏和显示行详细信息之间切换,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个DataGrid,它将RowDetailsVisibilityMode设置为“VisibleWhenSelected”,以便在选择特定行时显示RowDetailsTemplate。我希望在再次单击行时能够切换RowDetails可见性。默认情况下,只要选定了行详细信息,就可以看到该行详细信息,但如果再次单击该行,我希望基本上“取消选择”该行 在尝试了很多东西之后,我找到了一种古怪的解决方案,它至少可以让我在单击行时切换可见性: private async void DataGrid_Pr

我有一个DataGrid,它将RowDetailsVisibilityMode设置为“VisibleWhenSelected”,以便在选择特定行时显示RowDetailsTemplate。我希望在再次单击行时能够切换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中的任何内容时。可能吗?我不想为每一行使用额外的扩展按钮。

我认为全局布尔变量可以为您进行切换

        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进行切换,但目前的主要问题是,我希望它仅在单击行本身时进行切换,而不是在单击下面的行详细信息时进行切换。