Пользовательский шаблон WPF DataGrid автоматически создает привязку содержимого столбца - PullRequest
0 голосов
/ 04 января 2019

поэтому у меня есть сетка данных, структура SourceItem которой неизвестна, но нуждается в небольшом изменении ... Я использую AutoGenerateColumns, но для одного из типов данных я переопределяю свой собственный столбец, используя событие dg_AutoGeneratingColumn, в котором я проверяю e.PropertyType и переопределите e.Column с помощью моего нового ColumnTemplate (наследуется от DataGridBoundColumn).

Вообще говоря, он выполняется и хорошо отображается, за исключением того, что я пытаюсь заставить привязку данных (путь неизвестен) перетекать в мой пользовательский шаблон ColumnTemplate.

CustomTemplate : DataGridBoundColumn
{
    public static DependencyProperty dpblah;
    private void MyCode() { GetValue(dpBlah); }
}

DataGrid_AutoGeneratingColumn(...) {
    var oldBinding = (e.Column as DataGridBoundColumn).Binding;
    e.Column = new CustomTemplate { Header = e.PropertyName };
    BindingOperations.SetBinding(e.Column, dpBlah, oldBinding);
}

кажется, что все работает, но когда MyCode () запускается, GetValue не имеет ничего.

Есть что-то, что я пропускаю? Почему я не могу получить значение из привязки?

1 Ответ

0 голосов
/ 04 января 2019

Вы можете установить в свойстве путь привязки, а затем использовать этот путь при создании визуальных элементов в классе CustomTemplate:

var oldBinding = (e.Column as DataGridBoundColumn).Binding as Binding;
e.Column = new CustomTemplate { Header = e.PropertyName, dpblah = oldBinding?.Path?.Path; };

В CustomTemplate вы можете получить значение свойства для определенного элемента, используя отражение, например ::

.
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
    string bindingPath = dpblah;
    object value = dataItem.GetType().GetProperty(bindingPath).GetValue(dataItem);
    ...
}

Если dataItem является DataRowView, вам не нужно использовать отражение:

DataRowView drv = dataItem as DataRowView;
if(drv != null)
{
    object value = drv[bindingPath];
}
...