我创建了一个显示数据网格的窗口。此数据网格的项目源是动态创建的数据表(即可能包含不同数量的列)。
在大多数情况下它工作正常,但是,当列的标题包含绑定语法字符时,绑定失败,列为空,我在输出控制台中看到错误。
示例:
<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')
我想我需要逃避角色,但我似乎无法找到正确的语法。到目前为止我发现的唯一解决方法是,在填充我的数据表时,用其他东西替换“有问题”的字符,它可以在绑定成功时起作用,但最终结果会让用户感到困惑,因为标题文本可能不同(缺少有问题的字符) )。
有什么方法可以解决这个问题吗?
答案 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 + "]") };
}