WPF Datagrid ItemsSource作为数据表,包含包含绑定语法的列

时间:2017-06-13 05:49:10

标签: wpf data-binding binding datagrid

我创建了一个显示数据网格的窗口。此数据网格的项目源是动态创建的数据表(即可能包含不同数量的列)。

在大多数情况下它工作正常,但是,当列的标题包含绑定语法字符时,绑定失败,列为空,我在输出控制台中看到错误。

示例:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication6"
        mc:Ignorable="d"
        SizeToContent="WidthAndHeight"
        Title="MainWindow">
    <Grid>
        <DataGrid Name="dgvGraphData"
                  AutoGenerateColumns="True"
                  IsReadOnly="True"
                  AlternatingRowBackground="Gainsboro"
                  BorderThickness="0"
                  SelectionMode="Single"
                  ItemsSource="{Binding Path=GraphData}" />
    </Grid>
</Window>

然后在后面的代码中,我这样做

public partial class MainWindow : Window
{
    public DataTable GraphData { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        GraphData = GetDataTable();
        DataContext = this;
    }

    DataTable GetDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("column name")); //appears fine
        dt.Columns.Add(new DataColumn("column /name"));//binding fails
        dt.AcceptChanges();
        DataRow dr = dt.NewRow();
        dr[0] = "foo";
        dr[1] = "bar";
        dt.Rows.Add(dr);
        dt.AcceptChanges();
        return dt;
    }
}

我在输出控制台中收到以下错误消息:

System.Windows.Data Error: 40 : BindingExpression path error: 'column' property not found on 'object' ''DataRowView' (HashCode=2754490)'.
BindingExpression:Path=column /name; 
DataItem='DataRowView' (HashCode=2754490); target element is 'TextBlock' (Name=''); 
target property is 'Text' (type 'String')

我想我需要逃避角色,但我似乎无法找到正确的语法。到目前为止我发现的唯一解决方法是,在填充我的数据表时,用其他东西替换“有问题”的字符,它可以在绑定成功时起作用,但最终结果会让用户感到困惑,因为标题文本可能不同(缺少有问题的字符) )。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

好的,找到解决方案here,感谢Magnus:

<DataGrid Name="dataGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    e.Column = new DataGridTextColumn() { Header = e.PropertyName, Binding = new Binding("[" + e.PropertyName + "]") };
}