コードビハインドでバインディングを作成しています。
IEnumerable<IDictionary<string, object>> rows = dg1.ItemsSource.OfType<IDictionary<string, object>>();
IEnumerable<string> columns = rows.SelectMany(d => d.Keys). Distinct(StringComparer.OrdinalIgnoreCase);
foreach (string column in columns)
{
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = column;
// Create a factory. This will create the controls in each cell of this
// column as needed.
FrameworkElementFactory factory =
new FrameworkElementFactory(typeof(TextBox));
**Binding b = new Binding() { Path=new PropertyPath(column)};**
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
// b.StringFormat = "d";
b.Converter = new MyConverter();
b.ConverterParameter = dg1;
factory.SetValue(TextBox.TextProperty, b);
// factory.AddHandler(TextBox.LostFocusEvent, new RoutedEventHandler(TextBox_LostFocus));
// Create the template itself, and add the factory to it.
DataTemplate cellEditingTemplate = new DataTemplate();
cellEditingTemplate.VisualTree = factory;
col.CellTemplate = cellEditingTemplate;
dg1.Columns.Add(col);
ここで、列の値が開始で始まり、(
右中括弧が含まれていない場合)
、次のエラーが発生します..
PropertyPath '一致しない括弧' の構文エラー
次のように簡単に再現できます。
public Window3()
{
try
{
InitializeComponent();
Binding b = new Binding() { Path = new PropertyPath("a(") };
}
catch (Exception)
{
throw;
}
}
さらに、が thenPropertyPath
のような値を持つ場合(abc)
、バインディングも失敗します。
このような拘束力のある問題を回避するための解決策は何でしょうか?
編集:
この回答からのヒント。