J'ai une liste ObservableCollection<string>
, qui est liée à une liste déroulante. Cette liste déroulante se trouve dans un datatemplate qui se trouve dans un 'DataGridTemplateColumn'.Combobox lié: texte disparaissant après le tri de la liste source des chaînes
Lorsque la grille de données est affichée (avec toutes les lignes), la colonne affichant cette liste déroulante fonctionne correctement. L'utilisateur peut sélectionner les éléments dans la liste déroulante, et quand il est sélectionné, la chaîne est liée à la cellule. (Juste pour votre information: la grille de données est liée à une autre ObservableCollection, donc le texte de la cellule est mis à jour dans cette liste - mais je ne pense pas que ce soit pertinent pour mon problème).
Tout va bien, mais un problème survient quand je vais ajouter un autre élément dans la liste ObservableCollection<string>
auquel la boîte combo est liée, et effectuer un tri. Le texte disparaît dans la partie 'zone de texte' de certaines des zones de liste déroulante précédemment modifiées. Si je ne trier pas la liste, (juste ajouter une nouvelle valeur) tout va bien.
Je pense que ce qui se passe est que la liaison est vissée quand je re-trier la liste. Parce que la liste a 'changé', l'ordre des chaînes dans la liste est maintenant différent, donc la liaison ne sait pas quoi afficher.
Comment puis-je faire fonctionner ceci? Le texte des comboboxes précédemment sélectionné disparaît lorsque je ré-trier la liste ObservableCollection<string>
.
Mon <DataGridTemplateColumn>
contenant la zone de liste déroulante est:
<WpfToolkit:DataGridTemplateColumn
Header="Category" Width="1*"
CellTemplate="{StaticResource ComboBoxCellDataTemplate}"
CellEditingTemplate="{StaticResource ComboBoxCellEditingTemplate}"/>
... et les DataTemplates sont liés:
<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>
Notez que la majorité de ce code est par Samuel Moura à http://sweux.com/blogs/smoura/index.php/tag/datagridcolumn/