What is it about DataTable Column Names with dots that makes them unsuitable for WPF's DataGrid control?

前端 未结 4 1319
生来不讨喜
生来不讨喜 2020-11-27 21:21

Run this, and be confused:



        
相关标签:
4条回答
  • 2020-11-27 21:40

    I ended up using the substituting the ONE DOT LEADER and it worked great. I imported my data from an XML file and instead of using string.replace(".","\x2024"); everywhere in my code it was easier to change the import file.

    Before
    <Components Description="Thru Tee" Size="0.5" Kv="0.54" />
    After
    <Components Description="Thru Tee" Size="0&#x2024;5" Kv="0.54" />
    
    0 讨论(0)
  • 2020-11-27 21:43

    You can keep AutoGenerateColumns set to true and add an eventhandler to deal with any periods (or other special characters):

        <DataGrid
        Name="r2"
              ItemsSource="{Binding Path=.}"
              AutoGeneratingColumn="r2_AutoGeneratingColumn">
        </DataGrid>
    

    Codebehind:

    private void r2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyName.Contains('.') && e.Column is DataGridBoundColumn)
        {
            DataGridBoundColumn dataGridBoundColumn = e.Column as DataGridBoundColumn;
            dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]");
        }
    }
    

    This worked better for me in a MVVM scenario.

    0 讨论(0)
  • 2020-11-27 21:46

    The FULL STOP (period/dot) character does not work.
    Even escaping with x\002E did not work.

    Here is a compromise using the MIDDLE DOT character:

    dt1.Columns.Add("a\x00B7name", typeof(string));  
    dt1.Columns.Add("b\x00B7name", typeof(string));
    
    0 讨论(0)
  • 2020-11-27 21:47

    The full stop character in the column names of the second table are incorrectly interpreted by the binding path parser. Look at the debug output while this example is running and you can see that the auto-generated columns have been bound to 'a' and 'b' rather than 'a.name' and 'b.name'

    System.Windows.Data Error: 40 : BindingExpression path error: 'a' property not found on 'object' ''DataRowView' ... etc.
    System.Windows.Data Error: 40 : BindingExpression path error: 'b' property not found on 'object' ''DataRowView' ... etc.
    

    There are a number of different characters which have special meaning in a binding path including full stop ('.'), slash ('/'), square brackets ('[',']') and parenthesis ('(',')'), the parenthesis will cause your app to crash. These special characters can be escaped by surrounding the binding path with square brackets. More information about paths and character escaping can be found in the Binding Declarations Overview

    To fix this you will have to set AutoGenerateColumns="False" and specify the column bindings in the xaml:

        <DataGrid
        x:Name="r2"
              ItemsSource="{Binding .}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="a.name" Binding="{Binding Path=[a.name]}" />
                <DataGridTextColumn Header="b.name" Binding="{Binding Path=[b.name]}" />
            </DataGrid.Columns>
        </DataGrid>
    

    or programmatically in the code behind

            r2.AutoGenerateColumns = false;
            foreach( DataColumn column in dt2.Columns )
            {
                var gridColumn = new DataGridTextColumn()
                {
                    Header = column.ColumnName,
                    Binding = new Binding( "[" + column.ColumnName + "]" )
                };
    
                r2.Columns.Add( gridColumn );
            }
    
            r2.DataContext = dt2;
    
    0 讨论(0)
提交回复
热议问题