#wpf #data-binding #binding
#wpf #привязка данных #привязка
Вопрос:
У меня есть DataGrid, и я хочу заполнить столбец, содержащий поле со списком, динамическим источником элементов ItemsSource на основе строки. У меня поле со списком отображается правильно, и в списке заполнен правильный список элементов, полученный из AvailableLogFileProcessTypes
свойства, которое является ReadOnlyCollection. Однако, когда выбор сделан пользователем в поле со списком, LogFileProcessType
свойство не устанавливается для выбора.
Данные:
Property LogFileDirectories, IEnumerable<LogFileData>,
LogFileData:
public LogFileProcessType LogFileProcessType{get;set;}
public ReadOnlyCollection<LogFileProcessType> AvailableLogFileProcessTypes { get; set; }
В настоящее время у свойства есть резервное поле, и точка останова в свойстве set не задается, поэтому я знаю, что она локализована в настройках привязки. Что не так с моим XAML, что мешает установить свойство?
Как вы можете видеть, я попытался установить как SelectedValue, так и SelectedItem в CellEditingTemplate и CellTemplate . Я не уверен, какой из них подходит.
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=LogFileDirectories, UpdateSourceTrigger=PropertyChanged}"
HeadersVisibility="Column" CanUserReorderColumns="False" CanUserAddRows="False" Margin="0,0,0,35" Grid.RowSpan="3">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Processed" Binding="{Binding Path=IsProcessingComplete, Mode=OneWay}" Width="70" IsReadOnly="True" />
<DataGridTemplateColumn Header="template">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Ответ №1:
Смотрите ответ Damascus для процесса мышления.
Необходимо указать UpdateSourceTrigger в CellTemplate / CelLEditTemplate. Это запускает изменение свойства.
<DataGridTemplateColumn Header="template">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=LogFileProcessType, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Ответ №2:
Попробуйте добавить это в свой ComboBox
:
<ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
ItemsSource="{Binding Path=AvailableLogFileProcessTypes, UpdateSourceTrigger=PropertyChanged}"/>
Следовательно, при UpdateSourceTrigger
установленном значении PropertyChanged
каждый раз, когда объект AvailableLogFileProcessTypes
будет изменяться и вызываться OnPropertyChanged
, он ItemsSource
будет обновляться.
Комментарии:
1. Моя проблема в том, что при изменении пользователем поля со списком LogFileProcessType в объекте резервных данных LogFileProcessType не изменяется. Я в порядке с типами AvailableLogFileProcessTypes. Этот список не изменяется при изменении LogFileProcessType.
2. Виноват, я не правильно понял. Не могли бы вы добавить немного подробностей о том, как организованы ваши объекты? Где именно находится
LogFileProcessType
в вашей иерархии?3. Я добавил раздел данных. Я ставлю вам 1, поскольку вы навели меня на правильный путь. Смотрите редактирование.