views:

150

answers:

0

Hi,

Ive got an ObservableCollection<string> list, which is bound to a combobox. This combobox is in a datatemplate which is inside a 'DataGridTemplateColumn'.

When the datagrid is displayed (with all the rows), the column displaying this combobox works just fine. The user can select the items in the combobox, and when it's selected, the string is bound to the cell. (Just for your info: the datagrid is bound to another ObservableCollection so the cell text gets updated in that list - but i don't think it's relevant to my problem).

This is all good but a problem arises when i go to 'add' another item in the ObservableCollection<string> list that the combo box is bound to, and perform a sort. The text disappears in the 'textbox' part of some of the previously modified comboboxes. If i do not sort the list, (just add a new value) everything is fine.

I think what is happenning is that the binding gets screwed up when i re-sort the list. Because the list has 'changed', the order of the strings in the list are now different, so the binding doesn't know what to display.

How can i get this to work? The previously selected comboboxes's text disappears when i re-sort the ObservableCollection<string> list.

My <DataGridTemplateColumn> containing the combo box is:

<WpfToolkit:DataGridTemplateColumn
                Header="Category" Width="1*"
                CellTemplate="{StaticResource ComboBoxCellDataTemplate}"
                CellEditingTemplate="{StaticResource ComboBoxCellEditingTemplate}"/>

...and the related DataTemplates are:

    <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>

Jack.

Note that the majority of this code is by Samuel Moura at http://sweux.com/blogs/smoura/index.php/tag/datagridcolumn/