Windows Presentation Foundation(WPF)应用程序的新增和改进的DataGrid控件。可以绑定到多个数据源。灵活的可编程渲染选项,以匹配自定义用户界面。
我正在创建一个 WPF 数据网格,我希望能够通过拖放对行重新排序,如下所示:我单击一行并将其向上或向下拖动。正如我所做的那样,一个标记显示了该行将被放置的位置...
在 AddNew 或 EditItem 事务 mvvm 期间不允许 WPF DataGrid“刷新”
我有以下网格 我有以下网格 <DataGrid x:Name="TablesDataGrid" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding FilteredModels.View}" AlternationCount="2" AutoGenerateColumns="False" CanUserSortColumns="True" CanUserReorderColumns="False" CanUserDeleteRows="False" CanUserAddRows="False" SelectionMode="Extended" IsReadOnly="False" SelectionUnit="FullRow" RowHeight="25" HorizontalAlignment="Stretch" ColumnWidth="Auto"> <DataGrid.Columns > <DataGridCheckBoxColumn Width="*" Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsReadOnly="False"> <DataGridCheckBoxColumn.HeaderTemplate> <DataTemplate> <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CheckAll}"/> </DataTemplate> </DataGridCheckBoxColumn.HeaderTemplate> </DataGridCheckBoxColumn> <DataGridTextColumn Header="Source Table" Binding="{Binding SourceTableFullName}" Width="4*"></DataGridTextColumn> <DataGridTextColumn Header="EDW Schema" Binding="{Binding SchemaName}" Width="2*"></DataGridTextColumn> <DataGridTextColumn Header="EDW Table" Binding="{Binding TableName}" Width="4*"></DataGridTextColumn> <DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="*"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> 然后我有一个 searchCommand 对视图模型中的 collectionViewSource FilteredModels 执行搜索,然后调用 this.FilteredModels.View.Refresh(); 当用户选中一些复选框并将网格发送到编辑模式,然后执行搜索时,我们会收到以下错误 WPF DataGrid 'Refresh' is not allowed during an AddNew or EditItem transaction 有没有办法在选中复选框时强制网格退出编辑模式,甚至单击搜索按钮或其他修复方法? 谢谢! 我知道现在回答已经太晚了...但对于正在寻找答案的人来说 按如下顺序使用 cancelEdit 或 commitEdit 方法两次 //用于提交 this.datagrid_layers.CommitEdit(); this.datagrid_layers.CommitEdit(); //取消 this.datagrid_layers.CancelEdit(); this.datagrid_layers.CancelEdit(); 有一个干净的 MVVM 解决方案可以解决这个问题。首先,您的 ViewModel 必须实现 IEditableObject 接口(无操作就足够了)。然而,这还不够,因为 DataGrid 不会听 IEditableObject.CancelEdit。 另一个问题是,ICollectionView和IEditableCollectionView都没有实现另一个。虽然只有 ICollectionView 可以刷新,但只有 IEditableCollectionView 可以提交/取消。幸运的是,CollectionViewSource.GetDefaultView返回的集合视图实现了both: // ViewModel.cs public class ItemVM : IEditableObject, INotifyPropertyChanged { } public class ModuleVM : INotifyPropertyChanged { ICollectionView Items { get; } public ModuleVM(ObservableCollection<ItemVM> items) { Items = CollectionViewSource.GetDefaultView(items); } public void RefreshSafely() { ((IEditableCollectionView)Items).CancelEdit(); // alterantively, CommitEdit() Items.Refresh(); } } 或者换句话说,您可以将 ICollectionView 投射到 IEditableCollectionView 并先调用 CancelEdit()。 您应该能够将所选项目转换为 IEditableObject 并对其调用 EndEdit,或调用网格 CancelEdit 方法。 这是我的解决方案,请根据您的需要进行调整。 private void CommitEditRefreshViewSafely() { ((IEditableCollectionView)MyCollectionViewList.View).CommitEdit(); MyCollectionViewList.View.Refresh(); }
我有一个 DataGrid,其中包含 XAML 列,如下所示: 我有一个 DataGrid,其中包含 XAML 列: <DataGridTextColumn Header="Time" Binding="{Binding Date, StringFormat='yyyy-MM-dd HH:mm:ss'}" SortMemberPath="Date" SortDirection="Descending" Width="130" CanUserResize="True" /> <DataGridTextColumn Header="Level" Binding="{Binding Level}" Width="60" CanUserResize="True" /> <DataGridTextColumn Header="Source" Binding="{Binding Logger}" Width="150" CanUserResize="True" /> <DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" CanUserResize="True" /> 我将其绑定到 ObservableCollection<EalsLogEvent>,其中输入 EalsLogEvent.Date DateTime: public ObservableCollection<EalsLogEvent> LogEvents { get { return _logEvents; } } 网格视图模型使用计时器来刷新自身,网格的一切看起来都很好,除了在应用程序启动时首次加载时。然后,Time 列似乎按降序排序,但实际上是按升序排序。 为了正确排序,我必须单击列标题两次;第一次将顺序更改为升序,现在与列的内容匹配。第二次单击列标题会将其排序顺序更改回降序,这次它对列内容进行正确排序,即降序。 如果我在 _logEvents 刷新时使用 LINQ 对集合进行排序,我会丢失用户通过单击列标题为该列设置的任何顺序。如果我必须让视图告诉模型 LINQ 排序应该使用哪个顺序,那就有点糟糕了。 您可以在 XAML 中使用 CollectionViewSource 来定义默认排序。 假设我们有一个视图模型: public class ViewModel : INotifyPropertyChanged { public ObservableCollection<Item> Items { get; private set; } } 我们可以为 CollectionView 集合创建自定义 Items: <Window xmlns:l="clr-namespace:YourNamespace" xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"> <Window.DataContext> <l:ViewModel/> </Window.DataContext> <Window.Resources> <CollectionViewSource Source="{Binding Items}" x:Key="GridItems"> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="Date" Direction="Descending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> </Window.Resources> <DataGrid ItemsSource="{Binding Source={StaticResource GridItems}}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Time" Binding="{Binding Date, StringFormat='yyyy-MM-dd HH:mm:ss'}" Width="130" CanUserResize="True" /> <DataGridTextColumn Header="Level" Binding="{Binding Level}" Width="60" CanUserResize="True" /> <DataGridTextColumn Header="Source" Binding="{Binding Logger}" Width="150" CanUserResize="True" /> <DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" CanUserResize="True" /> </DataGrid.Columns> </DataGrid> </Window> 使用这种方法,您的底层源集合(本例中为Items)将不会受到影响,排序仅发生在视图中。 正如您可以在 MSDN 中阅读的那样: 您可以将集合视图视为绑定顶部的层 源集合,允许您导航和显示 基于排序、过滤和分组查询的集合,全部无需 必须操纵底层源集合本身。如果 源集合实现了 INotifyCollectionChanged 接口, CollectionChanged 事件引发的更改将传播到 意见。 您还应该注意以下事项: 所有集合都有一个默认的 CollectionView。 WPF 始终绑定到 视图而不是集合。如果直接绑定到集合, WPF 实际上绑定到该集合的默认视图。 因此,使用 CollectionViewSource,您只需为您的集合定义一个自定义视图。 您应该在视图模型中创建 2 个属性: private ObservableCollection<EalsLogEvent> logEvents = new ObservableCollection<EalsLogEvent>(); private ICollectionView logEventsView; public ObservableCollection<EalsLogEvent> LogEvents { get { return this.logEvents; } set { this.SetProperty(ref this.logEvents, value); } } public ICollectionView LogEventsView { get { if (this.logEventsView == null) { this.logEventsView= CollectionViewSource.GetDefaultView(this.LogEvents); this.logEventsView.SortDescriptions.Add(new SortDescription("Time", ListSortDirection.Descending)); } return this.logEventsView; } } 将 DataGrid 绑定到 LogEventsView,并使用 LogEvents 添加或删除项目。 这允许默认排序和用户排序。
选择datagrid标题中的所有复选框及其在wpf mvvm中的绑定
我正在研究wpf(mvvm架构)。我正在使用数据网格列出复选框,并在标题中单击“全选”复选框,我希望选中所有复选框,反之亦然......
如何在WPF C#中获取dataGrid中单元格的大小和位置
我已经开始在 WPF 中使用 dataGrid,但是来自 WinForm,它与我习惯的有点不同.. 我现在的问题是我需要获取特定单元格的矩形(这样我就可以
在我的 .NET 3.5 WPF 应用程序中,我有一个 WPF DataGrid,它将填充 500 列和 50 行。 App 的性能在滚动时非常非常差,或者当我执行 DataGrid.Items.Refres 时...
WPF DataGrid(MultiSelector?)多次引发 SelectedItems CollectionChanged 事件
我不确定这是否是 DataGrid 控件或 MultiSelector 的问题,但是当我在网格中选择多行时,每个单行都会触发 CollectionChanged 事件...
WPF Datagrid DataGridTextColumn 不允许小数
我无法在 DataGridTextColumn 中输入十进制值。如果 UpdateSourceTrigger = PropertyChanged,下面的链接建议我们不能输入小数值。 WPF DataGridTextColumn 绑定不&...
WPF DataGrid不在PropertyChanged上更新
使用NotifyPropertyChanged单击按钮更新我的数据网格时出现问题。如果我在后面的代码中设置了DataGrid.ItemsSource,它会起作用,但是如果我在xaml中设置它,它将不起作用。这是一些...
当选定的单元格位于该行时设置WPF DataGrid行标题的样式?
我有一个WPF DataGrid,它配置为仅允许单个单元格选择,即:-SelectionMode =“ Single” SelectionUnit =“ Cell”我想要做的是更改...的行标题的背景。
“从Datagrid(C#WPF)更新SQL表时,尚未初始化ConnectionString属性”
System.Data.dll中发生了'System.InvalidOperationException类型的未处理的异常。其他信息:ConnectionString属性尚未初始化。这是...
我正在执行MVVM,其中将DataGrid绑定到ObservableCollection,并使用DeleteItemCommand挂接到DataGrid.InputBindings,如下所示: []
Cast Datagrid.SelectedItems集合到列表
我有一个类似此类的类Foo {public string prop1 {get; set;} public string prop1 {get; set;}}}带有List 的视图模型,此列表用作一个Bind的绑定...
我正在SQL Server 2008数据库上运行SQL查询。该查询的结果显示在WPF DataGrid中。我的代码很好用,除非数据集为空。我希望用户成为...
带有单元格材质设计PackIcon的WPF Datagrid
我正在尝试使用在C#中生成的几列填充一个数据网格。其中一列是PackIcon或PackIconMaterial,另一列是带有多个文本列的复选框。图像将...
是否可以立即公开DataGridComboBoxColumn?
是否可以在加载数据网格时使WPF工具包数据网格的DataGridComboBoxColumn暴露在外?默认情况下,您必须单击单元格以显示组合框。我希望用户看到...
我有一个正在使用的简单WPF应用程序,该应用程序执行SQL查询并在DataGrid中显示结果数据。一切都按预期进行,但性能很差。长度...
如何使用JSON来填充的ObservableCollection?
如何使用JSON来填充的ObservableCollection?现在只有剧本本身和桌面应用程序的模型。我不明白如何打起来。我得到它在运行脚本之后:{” ...