Связанный комбинированный список: текст исчезает после сортировки исходного списка строк - PullRequest
2 голосов
/ 04 марта 2010

У меня есть список 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/

1 Ответ

2 голосов
/ 19 ноября 2010

Эй, я думаю, у меня есть решение для тебя. Просто добавьте следующую строку в определение Datagrid

SelectionUnit="Cell"

Я не знаю, как, это сработало для меня :) Просто попробуйте и дайте мне знать, если это поможет.

...