You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"/>

优化建议

  1. 通过LINQ简化DataRow到ObservableCollection的转换:
var collection = new ObservableCollection<DataRow>(dataTable.Rows.Cast<DataRow>());
  1. 编辑完成后同步回数据库的处理:
    遍历ObservableCollection<DataRow>,标记修改状态后通过TableAdapter提交更改:
foreach (var row in collection)
{
    if (row.RowState != DataRowState.Unchanged)
    {
        row.AcceptChanges();
    }
}
adapter.Update(dataTable);

内容的提问来源于stack exchange,提问作者Rev1k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:13:29