Tag: datagrid

WPF DataGrid的结构 – 根据值更改单元格

我确实将Object绑定到DataGridTextColumn并希望从相应的CellStyle中引用其中一个属性。 我假设此列的每个单元格都包含一个MyObject实例。 但是我无法在DataGridCell找到对Object的引用(我使用了一个简单的转换器来设置断点并搜索了DataGridCell -object很长一段时间)。 我正在寻找属性MyObject.IsEnabled,并希望在路径属性中引用??? 在下面的代码中。 有什么建议? 编辑: 由于我希望稍后将此样式应用于我的DataGrid的所有单元格,因此必须通过RelativeSource查找绑定到单元格的对象,而不是向MyObject添加硬编码绑定。 解 由于antiocol的输入,我能够为我的案例找到一个可能适用于类似问题的解决方案。 由于问题是我们无法从CellStyle访问Cell或CellModel的CellStyle ,因此我们使用DataGridCell上的附加Property将整个CellModel存储在那里。 从那里我们可以将DataGridCell任何可访问属性绑定到我们的CellModel任何属性。 附属物的代码: public static class DataGridUtils { public static CellModel GetCellModel(DependencyObject obj) { return (CellModel)obj.GetValue(CellModelProperty); } public static void SetCellModel(DependencyObject obj, CellModel value) { obj.SetValue(CellModelProperty, value); } public static readonly DependencyProperty CellModelProperty = DependencyProperty.RegisterAttached(“CellModel”, typeof(CellModel), typeof(DataGridUtils), new UIPropertyMetadata(null)); 我们需要在DataGrid中的每个单元格上设置此属性。 我没有在XAML中找到一个很好的解决方案,所以现在我在检索信息之前将它设置在转换器中。 (有待改进的建议) 转换器: […]

绑定到祖先的Datacontext

最好先向我展示我的代码,然后提出问题: 我有DataGridComboBoxColumn并希望将ItemsSource绑定到Window的DataContext ,并将SelectedItem绑定到DataGrid的当前ItemsSource对象。 如何才能做到这一点 ? 谢谢!

Datagrid不会刷新已更改的数据

有没有办法让datagrid监听数据库并在数据库数据发生变化时自动更新数据? 我使用SQL Server数据库。 如果可能的话,我想使用Linq-2-SQL

带有AutoGenerateColumns的WPF Datagrid中的ItemTemplateSelector

在我们的数据网格中,我们使用ItemTemplateSelector根据绑定到特定单元格的数据在两个数据模板之间切换。 由于列数取决于当前数据集,我们在DataGrid使用AutoGenerateColumns 。 似乎这种特殊组合效果不佳 – 甚至没有调用模板选择器。 我们可以在自动创建列的数据网格中使用模板选择器吗? 更具体地说:这是否可以使用XAML而不将逻辑放入代码隐藏文件或使用自定义行为? 我们的数据网格定义相当简单: 项模板选择器定义 :

WPF DataGrid删除IEditableCollectionView.CancelNew()上的NewItemPlaceholder

概观 我正在开发一个WPF应用程序(使用.NET 4.5),其中一部分涉及在DataGrid中显示一些数据。 用户可以在DataGrid中添加新行,并通过其他位置的按钮删除一行。 当用户开始添加无法提交的新行然后按下删除按钮时,我遇到了问题。 应取消新行,并将DataGrid重置为其先前的状态。 但是,DataGrid的NewItemPlaceholder行将被删除,并且不再显示。 我做了一个示例项目来演示这个问题。 这是一个简短的截屏video。 这就是示例应用程序的样子。 重现: 双击最上面一行的价格单元格 输入无效的数字以通过例外触发validation (可选)选择另一行 单击“删除”按钮 码 viewmodel获取ObservableCollection中的数据,ObservableCollection用作集合视图的源。 我有一个简单的命令连接到删除按钮。 如果用户正在添加项目( IEditableCollectionView.IsAddingNew ),我尝试在collectionView上使用.CancelNew()取消操作。 但是,当命令完成时,DataGrid NewItemPlaceholder删除其NewItemPlaceholder 。 到目前为止,我已经尝试过: 触发DataGrid以通过设置dataGrid.CanUserAddRows = true再次显示占位符,这有点修复了问题,但这是一个可怕的解决方法并且它是错误的,之后占位符不可编辑。 从源集合中删除无效项: this.productsObservable.Remove(this.Products.CurrentAddItem as Product) 。 这不会改变行为,占位符仍然被删除。 从集合视图中删除该项: this.Products.Remove(this.Products.CurrentAddItem) 。 这会引发exception,这是有道理的: ‘Remove’ is not allowed during an AddNew or EditItem transaction. 有没有其他方法可以取消用户的添加并显示NewItemPlaceholder? 在示例项目中,为了简单起见,我在VM构造函数中实例化数据。 实际上我正在使用对服务的异步调用,将结果包装在ObservableCollection中,而ViewModel实现了INotifyPropertyChanged。 业务对象未实现INPC。 示例项目的XAML: ViewModel,以及一个简单的业务对象: using […]

如何在DataGrid中隐藏自动生成的列?

我已经从SQL服务器自动从DataTable填充了DataGrid。 我希望用户能够添加或删除哪些列可见。 我原本试过这个: public void populateTaskTable(DataTable dt) { //add the whole datatable to the datagrid dg.DataContext = dt.DefaultView; dg.Columns[0].Visibility = Visibility.Collapsed; } 对于相应的xaml(我已尝试使用和不使用AutoGenerateColumns=”True” <DataGrid Name="dg" ItemsSource="{Binding}" AutoGenerateColumns="True" <!– –> 这导致内存违规中断。 所以我做到了 MessageBox.Show(dg.Columns.Count()); 要查看列是否正在填充,它不是,它输出0即使我可以看到程序中的列。 我从之前的stackoverflow问题中发现“自动生成的列未添加到列索引”。 然后从这个问题我尝试更新DataGrid以获得像这样填充的列 taskTable.UpdateLayout(); 和 taskTable.Items.Refresh(); 哪个什么都没做。 有没有办法访问自动生成的DataGrid的属性,或者是将DataGrid的所有列添加到Columns组件的方法? 提前致谢。

WPF datagridcombobox列:如何管理选择事件的变化?

我有一个带有combobox列的数据网格 我想要一个仅在用户将值更改为combobox时触发的事件。 我该如何解决这个问题?

从后台Worker更新ObservableCollection

我有一个DatGrid,它绑定到var Result_Full = new ObservableCollection() 。 这是一个包含多个字符串和双变量的简单类。 没什么难的。 我所做的是,我读了一个Excel文件(使用Telerik RadSpreadProcessing),它将行解析到我的类中。 我在一个线程上执行此操作,以便不阻止UI。 我遇到了一些问题: 1)我不能在读取excel文件的长进程中使用ref关键字(因为Result_Full是绑定到DataGrid的公共属性),但是我必须创建临时ObservableCollection() ,其中放置值。 完成该过程后,我运行以下脚本来复制值: foreach (var item in tmpFull) { InvokeOnUIThread(() => { Result_Full.Add(item); }); } 我想做的是,能够实时查看(如果可能)如何将项目添加到我的DataGrid中的集合中。 当我使用.Net 4.5时,我尝试按照其他post的建议实现BindingOperations.EnableCollectionSynchronization ,但我无法弄清楚如何将我的UI模型集合Result_Full绑定到进程中临时使用的。 2)即使使用当前设置,当我(在我的UI下)移动到包含DataGrid的我的Tab(我的DataGrid在不同的TabPage上)时,我尝试使用上面提到的代码将新项添加到集合中,它返回错误说: 调用线程无法访问此对象,因为另一个线程拥有它。 ,这是相当奇怪的,因为InvokeOnUIThread只是Dispatcher.Invoke() ,它应该是线程安全的? 任何帮助将受到高度赞赏。 编辑:显示更多代码: 这是我从BackgroundWorker调用的过程: public void ProcessFile() { var tmpError = new ObservableCollection(); var tmpFull = new ObservableCollection(); var _reader = […]

检查事件是否已存在

我有一个数据网格加载行事件 _gridObj.LoadingRow += new EventHandler(_gridObj_LoadingRow); 在处理程序中我正在创建另一个事件。 在以下代码中,如何知道该行的MouseLeftBtn事件是否已存在? void _gridObj_LoadingRow(object sender, DataGridRowEventArgs e) { e.Row.MouseLeftButtonUp += new MouseButtonEventHandler(Row_MouseLeftButtonUp); } 谢谢, 巫毒

防止数据网格中的行更改

我研究了这个并且很难​​过:我有一个WPF DataGrid,并使用MVVM模型。 在某些情况下,我希望阻止更改DataGrid中的行的能力。 我研究了这个,并尝试过像这里找到的技术。 在实践中,这是有效的,但是有一个不受欢迎的’闪烁’(它选择点击的行片刻然后回到之前的选择),而这是一个接近的解决方案我希望有一个更优雅的方式,如防止首先是行改变。 我很惊讶没有SelectionChanging或BeforeSelectionChanged所以我可以取消激活事件; 并强行阻止我的视图模型中的索引更改似乎没有任何区别。 我怎样才能做到这一点? 谢谢。