WinUI3中CommunityToolkit DataGrid无法编辑的问题求助
WinUI3 CommunityToolkit DataGrid 无法编辑数据的解决办法
问题原因
直接绑定DataTable.DefaultView(即DataView)到DataGrid的ItemsSource时,CommunityToolkit DataGrid对DataRowView的编辑支持存在兼容性问题,即便设置了IsReadOnly="False",也无法触发编辑操作,仅能正常展示数据。
原问题代码
XAML部分
<controls:DataGrid x:Name="dataGrid" Grid.Row="2" Grid.Column="1" Width="880" MaxHeight="470" Margin="0,20,20,20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AlternatingRowBackground="Transparent" AlternatingRowForeground="Gray" AreRowDetailsFrozen="False" AreRowGroupHeadersFrozen="True" AutoGenerateColumns="False" CanUserReorderColumns="True" CanUserResizeColumns="True" ColumnHeaderHeight="32" FrozenColumnCount="0" GridLinesVisibility="None" HeadersVisibility="Column" HorizontalScrollBarVisibility="Visible" Loaded="dataGrid_Loaded" LoadingRow="dataGrid_LoadingRow" MaxColumnWidth="400" RowDetailsVisibilityMode="Collapsed" RowGroupHeaderPropertyNameAlternative="Range" IsReadOnly="False"> <controls:DataGrid.Columns> <controls:DataGridTextColumn Binding="{Binding Row.ZEILENNR}" Header="ZEILENNR"/> <!-- 更多类似列 --> </controls:DataGrid.Columns> </controls:DataGrid>
C#填充代码
DatabaseHelpers.DataSet.MyDataTable dataTable = new DatabaseHelpers.DataSet.MyDataTable(); DatabaseHelpers.DataSetTableAdapters.MyDataTableAdapter adapter = new DatabaseHelpers.DataSetTableAdapters.MyDataTableAdapter(); adapter.Fill(dataTable, 1); dataGrid.ItemsSource = dataTable.DefaultView;
可行解决方法
将DataTable中的行转换为ObservableCollection<DataRow>,再通过CollectionViewSource绑定到DataGrid,即可正常开启编辑功能:
DatabaseHelpers.DataSet.MyDataTable dataTable = new DatabaseHelpers.DataSet.MyDataTable(); DatabaseHelpers.DataSetTableAdapters.MyDataTableAdapter adapter = new DatabaseHelpers.DataSetTableAdapters.MyDataTableAdapter(); adapter.Fill(dataTable, 1); ObservableCollection<DataRow> collection = new ObservableCollection<DataRow>(); foreach (DataRow row in dataTable.Rows) { collection.Add(row); } CollectionViewSource collectionViewSource = new CollectionViewSource(); collectionViewSource.Source = collection; dataGrid.ItemsSource = collectionViewSource.View;
注意:XAML中的绑定路径需要调整为直接绑定属性(数据源改为DataRow,不再是DataRowView):
<controls:DataGridTextColumn Binding="{Binding ZEILENNR}" Header="ZEILENNR"/>
优化建议
- 通过LINQ简化
DataRow到ObservableCollection的转换:
var collection = new ObservableCollection<DataRow>(dataTable.Rows.Cast<DataRow>());
- 编辑完成后同步回数据库的处理:
遍历ObservableCollection<DataRow>,标记修改状态后通过TableAdapter提交更改:
foreach (var row in collection) { if (row.RowState != DataRowState.Unchanged) { row.AcceptChanges(); } } adapter.Update(dataTable);
内容的提问来源于stack exchange,提问作者Rev1k
相关产品推荐
相关产品推荐

