Я использую WPF DataGrid , у которого ItemsSource связан с некоторым свойством MyResults
, где MyResults
- это DefaultView экземпляра DataTable . Поскольку мне нужна некоторая гибкость в маркировке заголовков столбцов в DataGrid, я подписываюсь на событие AutoGeneratingColumn
для настройки этих заголовков.
View / XAML:
<DataGrid x:Name="ResultTable" ItemsSource="{Binding MyResults, Mode=OneWay}"
cal:Message.Attach="[Event AutoGeneratingColumn] = [Action CustomizeAutoColumn($this, $eventArgs)]"
AutoGenerateColumns="True"/>
ViewModel / CS:
public DataView MyResults { get { return MyDataTable.DefaultView; } }
public void CustomizeAutoColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) {
e.Column.Header = AdjustHeaderText(e.Column.Header);
}
Количество столбцов в MyDataTable
может изменяться динамически, требуя, чтобы DataGrid обновлял свои автоматически созданные столбцы. В этом случае запускается следующая функция в ViewModel (подкласс Caliburn.Micro.Screen
):
private void UpdateResultTable() { // not working
NotifyOfPropertyChange(() => MyResults);
}
Моя проблема в том, что событие AutoGeneratingColumn
никогда не запускается с этой реализацией (или, по крайней мере, CustomizeAutoColumn
) никогда не называется). Ни во время инициализации программы (что является моей первой проблемой), ни при вызове UpdateResultTable
(вторая проблема). Хотя новое содержимое строки добавляется в представление, как и ожидалось, столбцы остаются такими, как есть.
Я нашел обходной путь, получив дескриптор объекта View в моей ViewModel, явно сбросив источник элементов. Однако это, очевидно, довольно уродливо, тем более что оно нарушает разделение View / ViewModel. Обратите внимание, что, поскольку я использую Caliburn Micro, у меня нет кода для представления XAML.
private void UpdateResultTable() { // working
var datagrid = VisualTree.FindChild<DataGrid>((DependencyObject)GetView(), "ResultTable");
datagrid.ItemsSource = null;
datagrid.ItemsSource = MyResults;
}
Есть идеи, как получить первоначальный подход к работе? Заранее спасибо за любые предложения!