- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一种行为,以允许我的 DataGrid
移动到 DataGrid
底部新添加的行。我有一些按钮可以在 ItemsSource
中添加/删除项目,并在添加新行时以编程方式设置 SelectedCensusReportMapping
。
我找到了这个解决方案 ( https://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM),它确实将新添加的行显示在 DataGrid
中。我遇到的问题是,当我尝试滚动 DataGrid
时,当前选定的行始终保持在 View 中,我无法滚动到其他行,这会将选定的行推出屏幕。
这是我的 DataGrid
的实现:
<DataGrid Name="DataGrid_CensusReportMapping"
ItemsSource="{Binding Model.CensusReportMappings, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedCensusReportMapping, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False">
<i:Interaction.Behaviors>
<h:ScrollIntoDataGridBehavior />
</i:Interaction.Behaviors>
</DataGrid>
如果我通过调试单步执行代码,我发现只要滚动 DataGrid
,就会触发该行为。为什么仅通过滚动 DatGrid
即可触发该行为。每当我滚动时都会发生这种情况,无论滚动所选项目是保留在屏幕上还是被推离屏幕。
这是行为代码:
public class ScrollIntoDataGridBehavior : Behavior<DataGrid>
{
/// <summary>
/// Override of OnAttached() method to add SelectionChanged event handler
/// </summary>
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
/// <summary>
/// Override of OnDetaching() method to add SelectionChanged event handler
/// </summary>
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SelectionChanged -=
new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
/// <summary>
/// When the selection is changed, re-focus on new selection using the ScrollIntoView method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid)
{
DataGrid grid = (sender as DataGrid);
if (grid.SelectedItem != null)
{
Action action = delegate()
{
grid.UpdateLayout();
if (grid.SelectedItem != null)
{
grid.ScrollIntoView(grid.SelectedItem, null);
}
};
grid.Dispatcher.BeginInvoke(action);
}
}
}
}
最佳答案
我遇到了与您在这里遇到的类似问题。滚动 DataGrid 时会偶尔触发多个 SelectionChanged 事件。
我注意到 WPF DataGrid 默认使用 UI Virtualization,这意味着 DataGrid 的每一行在滚动到用户视线后都是动态概括的。
如果您将 DataGrid 的属性 EnableRowVirtualization 设置为 false。 WPF 然后会在窗口打开之前预加载 DataGrid 的所有行。这将设法解决这个问题。
其他有用的链接: WPF Toolkit DataGrid scrolling performance problems - why? https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid.enablerowvirtualization?view=windowsdesktop-6.0 Difference between WPF DataGrid's EnableRowVirtualization and VirtualizingStackPanel.IsVirtualizing properties
PS:不过,我仍然不太确定为什么 DataGrid 滚动会触发 selectionChanged。自 2018 年以来这里的所有答案都是绕过,但触发行为本身仍然发生。
关于wpf - 滚动时触发 DataGrid SelectionChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968260/
打个比方,我们在 ComboBox 中有两个 Mr Men: 快乐先生 脾气暴躁的先生 我的 ViewModel 上有一个属性(在一定程度上使用 MVVM,在后面的代码中有一个 SelectionCh
我有一个 QTableView我需要从中获取 selectionChanged 事件。我似乎无法连接工作。我有: MyWidget.h ... protected slots: void slotL
我有一个权谋的问题(对我来说)。在我的 WPF 应用程序中,我有一个 ListBox,它在 ItemTemplate 中有一个 Combobox。当用户选择 ComboBoxItem 时,我必须对作为
我有一个 TabControl凡TabItem有一个单独的控件作为它的 Content元素。现在,我可以使用 UserControl.Loaded 在切换到选项卡时轻松执行 Storyboard。事件
我正在尝试编写跨浏览器 Web 扩展。 根据网页上的选定值,我想在上下文菜单中创建适当的条目。我创建了一个示例代码来检查浏览器是否正在进入事件监听器。在 Chrome 中,一切正常,但在 Firefo
ComboBox 上的 SelectionChanged 事件似乎仍然显示旧值。我需要获取它被更改为的值。有什么想法吗? 目前在我使用的 XAML 代码上: SelectionChanged="Txt
我在自己的应用程序上使用 ag-grid。我使用选项 checkboxSelection: true。当我点击复选框事件 selectionChanged 不包含行的表单数据。如何获取此数据? 代码
我有一个 DataGridViewComboBoxCell 控件,其中包含一些项目。我想在用户从下拉列表中选择一个值时获取这些值。我不能在可以使用 EditingControlShowing 的地方使
我通过以下 excel-vba 代码激活工作表上的给定单元格范围: Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVa
我一直在做一些研究,但其他人在这方面和我没有完全一样的问题,或者一直试图达到不同的目标。 我编写了一个宏(发布在下面),最终目标是根据用户先前的选择隐藏不相关的行。目前宏将实现最终目标,但并不完全符合
我只收到第一个事件通知,之后什么也没有发生。有什么想法吗? UPD:我发现了一件奇怪的事情。我的事件处理程序代码如下所示: var cell = range.C
我有一个 ListView绑定(bind)到 ItemsSource和 SelectionChanged事件在加载/数据绑定(bind)事件上触发?我认为这是因为选择了“默认”项目,即索引 0。 我怎
我想在特定的 div 元素上实现 JavaScrit selectionchange 事件,因此如果用户从 DOM 中选择文本,我想显示一个荧光笔框。我已经通过 onmouseup 事件在网络上实现了
我写了以下代码: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim myValue As Variant If Rang
我的问题是我想在我的 ViewModel 中调用“SelectionChanged”事件。 我有一个 ComboBox(这里称为 ListPicker,它是一个电话应用程序): 我在 ViewMod
我有一些 ComboBox控件,每个控件都有一些值。每个选定的值都会触发我的一个事件。 当从 ComboBoxA 中选择项目时,我的事件将使用所选项目的值触发。 当我的一个组合框刚刚打开和关闭时,其中
我创建了一个小宏来返回唯一值的数量,并在选择范围时将其显示在 Excel 的状态栏中。这在文档级别工作得很好。但是,当我尝试在应用程序级别运行 SelectionChange 事件时,该事件并未启动。
在 Windows UWP 中,NavigationView 的 ItemInvoked 和 SelectionChanged 事件有什么区别? API reference州 ItemInvoked
我有一个网格和一个表单,每次我们在该网格上选择一行时,我都需要在表单上显示不同的项目 我一直在寻找如何做到这一点,并找到了 Ext.getCmp('myform').hide() // or
我正在开发一个 Eclipse RCP 项目。它有几个带有 TreeViewer 的 View ,我使用 selectionChanged() 方法来处理选择事件。但是,有时我需要以编程方式设置选择。
我是一名优秀的程序员,十分优秀!