2

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 によるものです。

4

1 に答える 1

2

ねえ、私はあなたのための解決策を持っていると思います. 次の行を Datagrid 定義に追加するだけです

SelectionUnit="Cell"

方法はわかりませんが、うまくいきました:)試してみて、役立つかどうかお知らせください。

于 2010-11-19T12:43:08.513 に答える