如何获取WPF DataGrid单元格的位置?

时间:2016-12-08 16:29:32

标签: c# wpf datagrid wpfdatagrid

我有DataGrid绑定到Appointment个对象的集合。网格显示给定周的约会,列为天,行为时,ergo每个单元绑定到约会。

当用户单击一个单元格时,我想显示一个小窗口,其中包含该单元格约会的摘要。由于复杂的原因,我无法模拟单元格以显示摘要,更重要的是,我希望摘要下拉并覆盖所选单元格下方的单元格。

在我的命令链接到单击,通过一些魔术,我得到所选单元格本身的DataGridCellInfo,但该对象没有提供任何定位的提示,只提供一些维度。双击的输入绑定如下所示:

<DataGrid.InputBindings>
    <!--TODO Remove name 'TheGrid' and find parent DataGrid-->
    <MouseBinding MouseAction="LeftDoubleClick"  Command="{Binding ApptClickCommand}" CommandParameter="{Binding ElementName=TheGrid, Path=SelectedCells}" />
</DataGrid.InputBindings>

并且命令代码接收类型为SelectedCellsCollection的参数,该参数仅包含一个DataGridCellInfo。我没有其他信息可以在命令中使用。事实上,我对视图模型中的视图非常敏感,所以我想避免过度使用代码隐藏事件。

2 个答案:

答案 0 :(得分:2)

弹出窗口是特定于UI的东西,在我看来应该以某种方式从视图中定位。

过去当我做something similar时,我的ViewModel跟踪了实际数据,SelectedItem和IsDetailsVisible的标志。

从View中,我会看到一个位于网格顶部的“弹出式”UserControl。它的可见性与IsDetailsVisible属性绑定,数据绑定到SelectedItem。对于我的项目,弹出窗口是居中的,但是让View设置PopupUserControl的Top / Left属性以使其与用户单击的单元格匹配应该是一个简单的案例。

为了在UI中找到实际的网格单元,有几种方法可以解决这个问题。最简单的可能是使用Click或MouseDown事件,并根据Clicked DataGridCell从那里定位PopupUserControl。正如我所说,对我来说这种事情是特定于视图的,所以应该放在视图背后的代码中。

另外,我从不喜欢WPF的弹出窗口,所以制作了我自己的自定义UserControl,我会一直使用它。如果您对使用它或做类似的事情感兴趣,可以在我的博客here上找到该代码。

答案 1 :(得分:2)

以下是如何获取DataGridCell元素然后使用Visual.PointToScreen方法查找其屏幕坐标的示例:

docker run --rm -it --name container_name \
-v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image