ObservableCollection<string>
コンボボックスにバインドされたリストを取得しました。このコンボボックスは、「DataGridTemplateColumn」内にあるデータ テンプレートにあります。
データグリッドが (すべての行で) 表示されると、このコンボボックスを表示する列は正常に機能します。ユーザーはコンボボックス内の項目を選択できます。選択すると、文字列がセルにバインドされます。(参考までに:データグリッドは別のObservableCollectionにバインドされているため、そのリストでセルテキストが更新されますが、私の問題には関係ないと思います)。
これで問題はありませんがObservableCollection<string>
、コンボ ボックスがバインドされているリストに別の項目を「追加」して並べ替えを実行すると、問題が発生します。以前に変更されたいくつかのコンボボックスの「テキストボックス」部分でテキストが消えます。リストをソートしない場合 (新しい値を追加するだけ)、すべて問題ありません。
リストを再ソートすると、バインドが台無しになることが起こっていると思います。リストが「変更」されたため、リスト内の文字列の順序が異なり、バインディングは何を表示するかわかりません。
どうすればこれを機能させることができますか? リストを再ソートすると、以前に選択したコンボボックスのテキストが消えますObservableCollection<string>
。
<DataGridTemplateColumn>
コンボボックスを含む私のものは次のとおりです。
<WpfToolkit:DataGridTemplateColumn
Header="Category" Width="1*"
CellTemplate="{StaticResource ComboBoxCellDataTemplate}"
CellEditingTemplate="{StaticResource ComboBoxCellEditingTemplate}"/>
...関連する DataTemplates は次のとおりです。
<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/の Samuel Moura によるものです。