У меня есть список ObservableCollection<string>
, связанный с полем со списком. Этот комбинированный список находится в табличке данных, которая находится внутри DataGridTemplateColumn.
Когда отображается сетка данных (со всеми строками), столбец, отображающий этот комбинированный список, работает просто отлично. Пользователь может выбирать элементы в выпадающем списке, и когда он выбран, строка привязывается к ячейке. (Только для вашей информации: сетка данных связана с другой коллекцией ObservableCollection, поэтому текст ячейки обновляется в этом списке - но я не думаю, что это имеет отношение к моей проблеме).
Это все хорошо, но проблема возникает, когда я иду, чтобы «добавить» еще один элемент в список ObservableCollection<string>
, к которому привязано поле со списком, и выполнить сортировку. Текст исчезает в части «текстовое поле» некоторых ранее измененных комбинированных списков. Если я не сортирую список (просто добавьте новое значение), все в порядке.
Я думаю, что происходит то, что привязка облажается, когда я заново сортирую список. Поскольку список «изменился», порядок строк в списке теперь другой, поэтому привязка не знает, что отображать.
Как я могу заставить это работать? Текст ранее выбранных комбинированных списков исчезает при повторной сортировке списка ObservableCollection<string>
.
Мой <DataGridTemplateColumn>
, содержащий поле со списком:
<WpfToolkit:DataGridTemplateColumn
Header="Category" Width="1*"
CellTemplate="{StaticResource ComboBoxCellDataTemplate}"
CellEditingTemplate="{StaticResource ComboBoxCellEditingTemplate}"/>
... и соответствующие шаблоны данных:
<DataTemplate x:Key="ComboBoxCellDataTemplate">
<Label x:Name="lblCombo" Content="{Binding Category}" Style="{StaticResource BaseLabelCellStyle}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Categories, Mode=TwoWay}" Value="Both">
<Setter TargetName="lblCombo" Property="IsEnabled" Value="False" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate x:Key="ComboBoxCellEditingTemplate">
<!-- min=60, max=600 also, add in a 'specific' scalar value -->
<ComboBox
x:Name="comboBox"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Categories, Mode=TwoWay}"
SelectedItem="{Binding Category}" LostFocus="comboBox_LostFocus" IsEditable="True" PreviewKeyDown="comboBox_PreviewKeyDown" MaxDropDownHeight="100" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Enabled}" Value="False">
<Setter TargetName="comboBox" Property="IsEnabled" Value="True" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Categories, Mode=TwoWay}" Value="Both">
<Setter TargetName="comboBox" Property="IsEnabled" Value="True" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Обратите внимание, что большая часть этого кода принадлежит Самуэлю Моуре на http://sweux.com/blogs/smoura/index.php/tag/datagridcolumn/