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, кстати, большое им спасибо!

Другие вопросы по тегам