DevExpress Grid: уведомление о работах со свойством свойства для объявленной xaml gridcolumn, но не для программно добавленной gridcolumn
Я создал UserControl, содержащий DevExpress GridControl, в котором его GridColumns программно добавляются, когда "UCKit" (содержит различные параметры для UserControl, включая спецификации столбцов) привязан к элементу управления. Один из столбцов связан со свойством Count объекта ObservableCollection, которое является свойством класса, составляющего объект ItemsSource элемента GridControl, и не отвечает на уведомления PropertyChanged или даже на попытку обновления методом перебора, выполненную путем вызова grid.RefreshData(). Я написал тестовую программу, которая использует простые объявления GridColumn в xaml, и столбец Count работает нормально, но я не могу получить сетку, чьи GridColumns встроены в код для обновления.
Вот xaml, который успешно обновляется:
<dxg:GridControl Grid.Column="0" HorizontalAlignment="Stretch" Name="griddywiddy2" AutoGenerateColumns="None"
Grid.Row="2" Grid.ColumnSpan="4" VerticalAlignment="Stretch" ItemsSource="{Binding MyDataColl, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<dxg:GridControl.View>
<dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True"/>
</dxg:GridControl.View>
<dxg:GridControl.Columns>
<dxg:GridColumn Header="Row Name" Width="Auto" FieldName="RowName"/>
<dxg:GridColumn Header="Count" Width="Auto" FieldName="Stringz.Count"/>
</dxg:GridControl.Columns>
</dxg:GridControl>
И код xaml + C#, который этого не делает (имя строки обновляется, а Count нет):
<dxg:GridControl Grid.Column="0" HorizontalAlignment="Stretch" Name="griddywiddy" AutoGenerateColumns="None"
Grid.Row="1" Grid.ColumnSpan="4" VerticalAlignment="Stretch" ItemsSource="{Binding MyDataColl, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<dxg:GridControl.View>
<dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True"/>
</dxg:GridControl.View>
</dxg:GridControl>
private void InitializeColumns()
{
griddywiddy.Columns.Add(
new DevExpress.Xpf.Grid.GridColumn()
{
Header = "Row Name",
Binding = new Binding("RowName")
{
Mode = BindingMode.TwoWay,
Converter = null
},
Width = 100
});
griddywiddy.Columns.Add(
new DevExpress.Xpf.Grid.GridColumn()
{
Header = "Count",
Binding = new Binding("Stringz.Count")
{
Mode = BindingMode.OneWay,
Converter = null
},
Width = 100
});
}
Мои два метода обновления, оба из которых работают как для объявленных xaml столбцов, так и для столбца имени строки, построенного в коде, (вызваны в обработчиках нажатий кнопок в моей тестовой программе):
private void UpdBtn_Click(object sender, RoutedEventArgs e)
{
griddywiddy.RefreshData();
griddywiddy2.RefreshData();
}
private void UpdBtn2_Click(object sender, RoutedEventArgs e)
{
MyData incer = MyDataColl[0];
incer.NotifyPropertyChanged("Stringz.Count");
incer.NotifyPropertyChanged("RowName");
}
Я действительно озадачен тем, почему это свойство Count работает должным образом в случае xaml, но не в случае кода. Кто-нибудь может посоветовать, пожалуйста?
1 ответ
До меня дошло, что использование Binding = new Binding("Stringz.Count") при создании GridColumn (что мне не удается сделать) НЕ совсем эквивалентно установке FieldName="Stringz.Count" GridColumn = сделать в xaml, который работает.) Так что для этих "вложенных" уведомлений (которые требуют сложного пути), используйте метод FieldName для указания GridColumn.
Это решение было предоставлено ребятами из DevExpress, кстати, большое им спасибо!