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

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

问题描述:

我是C#WPF的新手,任何人都遇到过这种情况? (MVVM)MVVM将DataGrid绑定到DataTable显示错误列名

我将DataGrid的ItemSource绑定到DataTable。当我使用SQL命令“Select * from Testing1”(它连接到一个MDB文件)时,所有的数据都被修正填充在DataGrid中,除了Name列有问题。 “下划线”在列名中奇怪地丢失了。我测试的情况如下:

  • 正确的列名是“Testing_Field_3”,而它显示“TestingField_3”。
  • 正确的列名是“Testing_ Field__4”,而它显示“Testing_Field_4”。 (在这个网站上显示下划线有一些问题,此案应该是2下划线转换为1个下划线)

调试时,我查了数据表/记录,并且列名是正确的,没有任何问题。

下面是我的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}" /> 

如果是在C#中的错误,这方面的任何替代方案?

非常感谢你们的帮助,并提前致谢。

此行为的原因是ContentPresenter.RecognizesAccessKey,这是默认true对于datagrid header contentPresenter。如果此属性为true,则在头文本中使用AccessText

解决方法是挂钩到dataGrid的AutoGeneratingColumn事件,并用双下划线替换所有单下划线。示例如下 -

<DataGrid AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/> 

和事件处理程序 -

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

您也可以实现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> 
+0

感谢您的回复。我应该在哪里添加“DataGrid_AutoGeneratingColumn()”? (在ViewModel?)另外我应该如何定义DataGridAutoGeneratingColumnEventArgs? –

+0

事件应该位于文件后面的代码中,即'xaml.cs',但我建议您使用第二种方法,即覆盖ContentTemplate。 –

+1

这是伟大的!有用。谢谢!谢谢!谢谢! –