Учитывая следующий код:
<Window x:Class="DataViewBindingTrouble.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800" x:Name="Win">
<DataGrid ItemsSource="{Binding ElementName=Win, Path=TestData}"
AutoGenerateColumns="True" IsReadOnly="True"
AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" />
</Window>
код позади:
using System.Data;
using System.Windows.Controls;
namespace DataViewBindingTrouble
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
public DataView TestData
{
get
{
var dt = new DataTable();
var newRow = dt.NewRow();
var newCol = dt.Columns.Add();
//newCol.ColumnName = "uniqueColName";
var troublemaker = "This is not a [valid] property path and causes.trouble]";
//newCol.Caption = troublemaker;
newCol.ColumnName = troublemaker;
newRow[newCol] = "Foobar";
dt.Rows.Add(newRow);
return dt.DefaultView;
}
}
private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
// e.Column.Header = TestData.Table.Columns.OfType<DataColumn>()
// .Single(someCol => someCol.ColumnName == e.PropertyName).Caption;
}
}
}
Автогенератор для столбцов создает привязку с недопустимым путем свойства, поскольку специальные символы содержатся в столбцеимя не экранированоЯ могу обойти это без особых проблем, используя закомментированный код (читай: добавьте безвредные имена столбцов и сохраните заголовок отдельно), но если у меня нет контроля над моим источником данных, как можно это сделать?Я думал об использовании PropertyDescriptor вместо простого пути к свойству, но не смог найти простой способ получения PropertyDescriptors для столбцов DataTable без написания пользовательской оболочки.
Есть ли какие-то очевидные опции, которые я пропустил?