![](/img/trans.png)
[英]Get currently selected cell on Enter pressed in a datagrid C# WPF
[英]WinUI DataGrid (from CommunityToolkit): How to get the currently selected cell?
在 WinUI 3 应用程序中,我使用来自CommunityToolkit.WinUI.UI.Controls
命名空间的DataGrid
,请参阅MSDN DataGrid 类。
我正在寻找一种获取当前选定或单击的DataGridCell
实例的方法。
我需要这个,因为我想在用户选择/单击某个单元格时显示MenuFlyout
( MenuFlyout
控件就像一个小弹出窗口,请参阅MSDN MenuFlyout )。 此弹出窗口应显示在单元格旁边。 为此, MenuFlyout
类有一个ShowAt
方法可用,它接受FrameworkElement
类型的参数(“ ShowAt
放置目标的元素。”)。 我想将当前选定的单元格传递给这个方法。
这是我当前的代码:
private void MyDataGrid_CurrentCellChanged(object sender, System.EventArgs e)
{
MenuFlyout flyout = new MenuFlyout();
MenuFlyoutItem item = new MenuFlyoutItem();
item.Text = "Test";
flyout.Items.Add(item);
// How do I get an instance of the currently selected cell in the DataGrid?
FrameworkElement theCurrentlySelectedCell = ?;
flyout.ShowAt(theCurrentlySelectedCell);
}
问题是我不知道如何获取 DataGrid 当前选定/单击的单元格的实例。 我在DataGrid
类中找不到任何对此有帮助的内容。 不幸的是,我在上面的代码示例中使用的CurrentCellChanged
事件在其事件参数中也没有此信息,它只有一个EventArgs
类型的参数e
。 在这种情况下, sender
是 DataGrid,而不是单元格。
我确实发现 DataGrid 上有一个 CurrentColumn 属性,请参阅MSDN DataGrid CurrentColumn 。 但是我无法从这个实例到该行的DataGridCell
实例。
有谁知道如何获取当前选择或点击的DataGridCell
的实例?
我为我的问题找到了一个可接受的解决方案,但它不涉及获取所选DataGridCell
的实例。
我做的,以与小区的单元工作进行改变的各个栏DataGrid
到类型的列DataGridTemplateColumn
。 这允许定义组成每个单元格的控件。 例如使用Button
或DropDownButton
作为单元格内容。
以下代码声明性地创建了一个DataGridTemplateColumn
,它使用DropDownButton
呈现类ViewModelForRowData
的属性Text
的内容。 DropDownButton
在按钮旁边显示MenuFlyout
(请参阅我的问题)。 dropdwon 具有三个选项(菜单项),如果用户单击代表单元格内容的DropDownButton
,则会出现这些选项。 因为DropDownButton
实际上是单元格内容,这实际上是我需要的,即我不需要单击的DataGridCell
实例本身:
<controls:DataGridTemplateColumn Header="Test">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="viewModels:ViewModelForRowData">
<DropDownButton Content="{x:Bind Text}" HorizontalAlignment="Stretch" >
<DropDownButton.Flyout>
<MenuFlyout Placement="Bottom" ShowMode="Transient">
<MenuFlyoutItem Text="Menu Option 1" Command="{x:Bind Command1}" />
<MenuFlyoutItem Text="Menu Option 2" Command="{x:Bind Command2}" />
<MenuFlyoutItem Text="Menu Option 3" Command="{x:Bind Command3}" />
</MenuFlyout>
</DropDownButton.Flyout>
</DropDownButton>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
另一种方法是在代码隐藏文件中创建MenuFlyout
,该文件作为按钮单击事件处理程序的结果被调用。
<controls:DataGridTemplateColumn Header="Test" >
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="viewModels:ViewModelForRowData">
<Button Content="{x:Bind Text}" Click="ButtonClick"></Button>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
private void ButtonClick(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
Button button = sender as Button;
if (button == null)
{
return;
}
MenuFlyout flyout = new MenuFlyout();
MenuFlyoutItem item1 = new MenuFlyoutItem();
item1.Text = "TestItem 1";
flyout.Items.Add(item1);
MenuFlyoutItem item2 = new MenuFlyoutItem();
item2.Text = "TestItem 2";
flyout.Items.Add(item2);
FlyoutShowOptions flyoutShowOptions = new FlyoutShowOptions();
flyout.ShowAt(button, flyoutShowOptions);
}
在这种情况下,事件处理程序的sender
参数引用按钮,因此我可以使用它来指定MenuFlyout.ShowAt
方法的第一个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.