WPF DataGridComboBoxColumn TextBinding не обновляется - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь использовать DataGridComboBoxColumn, но у меня возникают проблемы с отображением текста, связанного с выбранным элементом. Технически я использую MaterialDataGridComboBoxColumn, который расширяет DataGridComboBoxColumn (см. Этот код здесь. Единственное реальное отличие, по-видимому, заключается в добавлении ItemSourceBinding, который облегчает привязку к нестатическому списку.)

Вот ComboBox в xaml:

<materialDesign:MaterialDataGridComboBoxColumn 
    Header="Meter" 
    ElementStyle="{StaticResource CenterEverything}" 
    ItemsSourceBinding="{Binding PotentialMeters}"
    DisplayMemberPath="Name" 
    TextBinding="{Binding Segment.Meter.Name, Mode=OneWay}" 
    SelectedItemBinding="{Binding Segment.Meter, UpdateSourceTrigger=PropertyChanged}" />

Источник элемента для DataGrid состоит из коллекции ObservableCollection, состоящей из SegmentWrappers:

public sealed class SegmentWrapper : INotifyPropertyChanged {
        public Segment Segment { get; set; }

        public List<Meter> PotentialMeters => GetPotentialMeters();

        public event PropertyChangedEventHandler PropertyChanged;

        private List<Meter> GetPotentialMeters() => Segment.Station.AllMeters;

    }

Объект Segment - это моя фактическая модель:

public sealed class Segment :  INotifyPropertyChanged {

        public Station Station { get; set; }

        public Meter Meter { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
}

Теперь, странная вещь, я могу заставить это работать иногда, когда я работаю в отладке. Обычно при запуске я не вижу имя выбранного измерителя в ComboBox, но если я удалю и повторно добавлю атрибут TextBinding из xaml выше, во время выполнения кода, имя будет отображаться правильно! Я думаю, это как-то связано с UpdateSourceTrigger, но я не могу понять это. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

У меня есть обходной путь для этого сейчас (так что, возможно, это не следует считать ответом? Я новичок в SO, поэтому я с радостью опубликую это как комментарий, если он не должен быть ответом).

Я переключился на DataGridTemplateColumn и в основном использовал одну и ту же привязку для всего, и это сработало.Я изменил свой исходный xaml следующим образом:

 <DataGridTemplateColumn  Header="Meter" Width="Auto" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox   Style="{StaticResource MaterialDesignDataGridComboBox}" 
                            Foreground="{DynamicResource MaterialDesignBody}"
                            ItemsSource="{Binding PotentialMeters, Mode=OneWay}" 
                            DisplayMemberPath="Name"
                            Text="{Binding Segment.Meter.Name, Mode=OneWay}" 
                            SelectedItem="{Binding Segment.Meter}">
                </ComboBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

У меня нет реального ответа на вопрос, почему оригинальный подход не сработал, но я доволен этим.

0 голосов
/ 09 марта 2019

В установщике свойств вашего сегмента укажите свойство для отражения в пользовательском интерфейсе

...