- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 DataGrid
,在每个 DataGridRow
中我都有行详细信息,其中包含几个控件。
我想要的是,如果在行详细信息中单击任何内容,则:
- 不选择行,或者更准确地说,
- 更改现有的 DataGrid
选择。
我正在考虑在行为中处理 PreviewMouseDown 和 MouseDown 事件,以某种方式使 DataGrid 跳过选择过程,但不确定如何继续。
最终我将在详细信息中包含一个包含更多信息的 TabControl,因此我也不希望通过单击 TabItem 来更改 DataGrid 的现有选择。
是否有一种方法可以在 Grid“DetailsContainer”级别启动 PreviewMouseDown 隧道并在 Grid“DetailsContainer”级别停止 MouseDown 冒泡
<DataGrid Name="dgAudit"
CanUserReorderColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
IsReadOnly="True"
ItemsSource="{Binding GEOM_ASSET_OC_LIST}"
VirtualizingPanel.ScrollUnit="Pixel"
RowDetailsVisibilityMode="Visible"
>
<i:Interaction.Behaviors>
<behaviors:DataGridBehaviors />
</i:Interaction.Behaviors>
<DataGrid.Columns>
<DataGridTextColumn Header="Asset ID" Binding="{Binding ASSET_ID}" Width="200" />
<DataGridTextColumn Header="Asset Type" Binding="{Binding ASSET_TYPE}" Width="200" />
<DataGridTextColumn Header="Last Update By" Binding="{Binding LAST_UPDATE_BY}" Width="150" />
<DataGridTextColumn Header="Last Update Date" Binding="{Binding LAST_UPDATE_DATETIME, StringFormat=\{0:dd.MM.yy HH:mm:ss tt\}}" Width="150" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid Name="DetailsContainer">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Name Text="{Binding Notes}" Width="400" HorizontalAlignment="Left" TextWrapping="Wrap"/>
<Button Content="Button" Grid.Column="1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
只是一个空行为的快速模拟
public class DataGridBehaviors : Behavior<DataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.MouseDown += DataGrid_MouseDown;
this.AssociatedObject.PreviewMouseDown += DataGrid_PreviewMouseDown;
}
protected override void OnDetaching()
{
this.AssociatedObject.PreviewMouseDown -= DataGrid_PreviewMouseDown;
this.AssociatedObject.MouseDown -= DataGrid_MouseDown;
base.OnDetaching();
}
private void DataGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
}
private void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
DataGridDetailsPresenter RowsDetails = FindParent<DataGridDetailsPresenter>(obj);
if (RowsDetails != null)
{
//Skip over selection, maybe temporarily removed native selection handler???
}
}
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
}
最佳答案
不幸的是,当前的 WPF DataGrid
实现无法实现您想要的。
DataGridDetailsPresenter
注册了一个 class event handler对于使用 EventManager
API 的 MouseLeftButtonDownEvent
路由事件:
EventManager.RegisterClassHandler(
typeof(DataGridDetailsPresenter),
MouseLeftButtonDownEvent,
new MouseButtonEventHandler(OnAnyMouseLeftButtonDownThunk),
true);
请注意,最后一个参数设置为 true
。它是一个标志,指示监听器是否希望听到已处理的事件。在这种情况下,即使您在任何级别将 RoutedEventArgs.Handled
属性设置为 true
,也会调用内部 DataGridDetailsPresenter
的事件处理程序无论如何。
此事件处理程序负责聚焦您在其中单击详细信息 View 的 DataRow
。您肯定知道,在 WPF 中,类事件处理程序在实例事件处理程序之前被调用。因此,左键单击详细信息行的呈现器会发生的第一件事是聚焦包含行(实际上是该行的第一个单元格)。
另请注意,此行为也会管理 RowPresenter
内虚拟项目的实现,因此禁用它可能会导致不需要的 GUI 副作用。
您可以将容器 Grid
的 IsHitTestVisible
属性设置为 false
,这将禁用自动行选择行为。但显然,您根本无法处理行详细信息中的任何点击。
关于c# - 如果在 RowDetails 中单击鼠标,如何阻止 DataGridRow 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396183/
假设我有一个像这样定义的 DataGrid
在修改 DataGrid 绑定(bind)到的集合(“Items”)时,我无法更新 RowDetailsTemplate。正在从 View 模型中修改集合。当我修改其中一个绑定(bind)项的 con
我有一个 DataGrid与 RowDetailsVisibilityMode设置为 Visible . 现在,当我选择一行时,我也想突出显示详细信息区域,而默认设置是仅突出显示行单元格。获得这种行为
我有一个 WPF 数据网格,它根据其中一列(操作列)的组合框选择来更改行详细信息数据模板。其中一个 rowdetails 模板较大,为 datagrid 提供的空间无法完全显示 rowdetails,
我有一个 WPF 数据网格,它根据其中一列(操作列)的组合框选择更改行详细信息数据模板。其中一个rowdetails template很大,datagrid提供的空间不能完全展示rowdetails,
我想解决的问题:当新项目添加到 RadGridView 时,相应地创建新行。我希望这些新行自动展开 RowDetails。 到目前为止我尝试了什么:我尝试从代码隐藏访问 RadGridView 并注册
我有一个带有在 RowDetailsTemplate 中定义的按钮的 DataGrid。问题是单击按钮时,第一次单击被 DataGrid 消耗以选择行,因此需要单击按钮两次。 我已经尝试过此处提供的解
我有一个数据网格,它显示包含两列文本行数据和一个更大的自由文本详细信息的项目,我通过仅包含边框和文本 block 的 rowdetails 模板显示该详细信息。 我遇到的问题是文本详细信息通常大于网格
我有一个 DataGrid,在每个 DataGridRow 中我都有行详细信息,其中包含几个控件。 我想要的是,如果在行详细信息中单击任何内容,则: - 不选择行,或者更准确地说, - 更改现有的 D
我对 .NET4 附带的新 DataGrid 组件有问题。使用 RowDetails 时会出现此问题。使用 RowDetails 可以在选择元素时增加网格的总高度。这对于显示所有 Rows 和 Row
我有三个 DataGrids设置为个人UserControls每个 ItemsSource绑定(bind)到不同的DependencyProperty在我的ViewModel . 当在第一个 Data
我有一个数据网格,例如 Datagrid1,其中填充了一个列表(通过代码隐藏动态实现)。在 datagrid 的行详细信息模板中,我想添加一个 datagrid,我们称之为 datagrid2,dat
我是 Angular 4 和 ngx-datatable 的新手,但我遇到了困难。现在,我有一个带有简单 rowDetail 的 ngx-datatable,就像显示的一样 here .问题是我需要
我有一个显示一堆对象的 DataGrid。这些对象具有属性 IsDetailsExpanded,我想将 DataRows DetailsVisibility 属性绑定(bind)到该属性。 我的第一种
当我们尝试使用 formGroup 时,我们尝试了一些错误。我需要一些关于表单组的解释。我想用数据创建一个表单组。数据需要逐行显示。我们使用 angular 8当我运行它时,出现了这个错误: No v
我的问题和这个类似; DataGrid RowDetails Width problem 除非我希望行详细信息永远不会超过它所跨越的列的宽度。 |--0--|--1--|--2--|--3--|--4
我是一名优秀的程序员,十分优秀!