首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单击DataGridRow时在隐藏和显示RowDetails之间切换

在单击DataGridRow时在隐藏和显示RowDetails之间切换
EN

Stack Overflow用户
提问于 2017-07-07 22:41:26
回答 2查看 1K关注 0票数 0

我有一个DataGrid,它将RowDetailsVisibilityMode设置为"VisibleWhenSelected“,这样当我选择特定的行时,RowDetailsTemplate就会显示出来。我想要的是当我再次单击行时能够切换RowDetails可见性。默认情况下,只要RowDetails处于选中状态,它就是可见的,但如果再次单击它,我想从本质上“取消选择”选中的行。

在尝试了很多东西之后,我找到了一种奇怪的解决方案,至少可以让我在单击行时切换可见性:

代码语言:javascript
复制
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按钮。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-08 00:02:45

我找到了我的问题的解决方案:

在ContentControl下的RowDetailsTemplate中,我添加了一个捕获PreviewMouseDown事件的EventSetter:

代码语言:javascript
复制
<EventSetter Event="PreviewMouseDown" Handler="ContentControl_PreviewMouseDown" />

该事件的处理程序设置了一个全局变量,该变量指示我是否已经单击了ContentControl中的内容:

代码语言:javascript
复制
private void ContentControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    ClickedRowDetails = true;
}

最后,在我的原始代码中,我只是简单地检查我是否单击了ContentControl,或者它是否是其他东西,在本例中,这意味着它是行本身:

代码语言:javascript
复制
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中的任何内容,而不会意外地折叠行。这是在没有扩展按钮的情况下完成的。

票数 2
EN

Stack Overflow用户

发布于 2017-07-07 22:46:42

我认为全局布尔变量可以为您完成切换。

代码语言:javascript
复制
        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;
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44973598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档