我是C#WPF的新手,以前有人遇到过这个案子吗? (MVVM)
我将DataGrid的ItemSource绑定到DataTable。当我使用SQL命令“Select * from Testing1”(它连接到MDB文件)时,所有数据都会在DataGrid中进行更正,但列名称有一些问题。 “Underscore”在列名中奇怪地丢失了。我测试了下面的案例:
调试时,我检查了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}" />
如果是C#中的错误,可以选择其他方法吗?
请欣赏你们的帮助,并提前致谢。
答案 0 :(得分:5)
此行为的原因是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 ContentTemplate
DataGridColumnHeader
来实现这一目标。在其中使用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>