MVVM绑定DataGrid到DataTable显示错误的列名

Tsu*_*ohn 1 c# sql wpf datatable datagrid

我是C#WPF的新手,以前有人遇到过这个案子吗?(MVVM)

我将DataGrid的ItemSource绑定到DataTable.当我使用SQL命令"Select*from Testing1"(它连接到MDB文件)时,所有数据都会在DataGrid中进行更正,但列名称有一些问题."Underscore"在列名中奇怪地丢失了.我测试了以下案例:

  • 正确的列名是"Testing_Field_3",而它显示"TestingField_3".
  • 正确的列名称为"Testing_ Field_ _4",同时显示"Testing_Field_4".(在这个网站上显示下划线有一些问题.案例应该是2下划线转换为1下划线)

在调试时,我检查了DataTable/Recordset,列名是正确的,没有问题.

下面是我的xaml的提取部分:

<DataGrid Grid.Column="0" Grid.Row="1" Width="650" Height="300" Margin="5,5,0,0" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding Path=SqlDataTbl, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)

如果它是C#中的一个错误,可以选择其他方法吗?

敬请各位朋友的帮助,并提前致谢.

Roh*_*ats 5

此行为的原因是ContentPresenter.RecognizesAccessKey,默认情况下truedatagrid header contentPresenter.如果此属性为true,则AccessText在标题文本中使用.

解决方法是挂钩AutoGeneratingColumndataGrid事件并用双下划线替换所有单个下划线.样品如下所示 -

<DataGrid AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/> 
Run Code Online (Sandbox Code Playgroud)

并在事件处理程序中 -

private void DataGrid_AutoGeneratingColumn(object sender, 
                                    DataGridAutoGeneratingColumnEventArgs e)
{
   e.Column.Header = e.Column.Header.ToString().Replace("_", "__");
}
Run Code Online (Sandbox Code Playgroud)

您也可以通过做到这一点overriding ContentTemplateDataGridColumnHeader.使用TextBlock它里面不承认从文本快捷键.

<DataGrid ItemsSource="{Binding Objects}">
  <DataGrid.ColumnHeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}"
            BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{TemplateBinding Content}" 
                               HorizontalAlignment="Center"/>
                 </DataTemplate>
            </Setter.Value>
        </Setter>
     </Style>
  </DataGrid.ColumnHeaderStyle>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)