Выпадающий список привязки данных WPF в столбце DataGridTemplateColumn

#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, поскольку вы навели меня на правильный путь. Смотрите редактирование.