2015-07-10 4 views
0

Я имею небольшой вопрос здесь:Проблемы с CollectionViewSource

В моем коде у меня есть ObservableCollection с некоторыми пунктами:

myCalenderItems = new ObservableCollection<CalendarItem>(); 

иметь список отсортирован, я создал CollectionViewSource, который я привязан в DataGrid в коде позади:

ICollectionView mySortedCalenderItems = CollectionViewSource.GetDefaultView(myCalenderItems); 

    mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Day", ListSortDirection.Ascending)); 
    mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Time", ListSortDirection.Ascending)); 

    MainGrid.DataContext = mySortedCalenderItems; 
    CalendarDataGrid.ItemsSource = mySortedCalenderItems; 

Часть XAML для Datagrid выглядит как:

<DataGrid Name="CalendarDataGrid" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False"> 
      <DataGrid.Columns> 
       <DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}"/> 
       <DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/> 
       <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/> 
      </DataGrid.Columns> 
      <DataGrid.GroupStyle> 
       <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}"> 
        <GroupStyle.Panel> 
         <ItemsPanelTemplate> 
          <DataGridRowsPresenter/> 
         </ItemsPanelTemplate> 
        </GroupStyle.Panel> 
       </GroupStyle> 
      </DataGrid.GroupStyle> 
     </DataGrid> 

Далее я также хочу, чтобы иметь возможность редактировать значения с помощью других элементов управления рядом с DataGrid, например

<ComboBox Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/> 

А вот где у меня есть проблемы. При изменении дня в datagrid выполняется сортировка, но при изменении его с помощью элемента управления combobox он изменяется в datagrid, но он не пересортирован. (Повторная сортировка выполняется при изменении другого свойства ранее измененного элемента)

У вас есть идеи, что здесь не так?

С уважением

PS: Весь XAML

<UserControl 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
     xmlns:local="clr-namespace:MyProject" 
     mc:Ignorable="d" 
     d:DesignHeight="520" d:DesignWidth="840"> 

<UserControl.Resources> 
    <ObjectDataProvider x:Key="WeekDayEnum" MethodName="GetValues" 
        ObjectType="{x:Type System:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:WeekDay"/> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</UserControl.Resources> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <Grid x:Name="MainGrid" Grid.Row="0"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="30"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="240"/> 
      <ColumnDefinition Width="180"/> 
     </Grid.ColumnDefinitions> 

     <Label Grid.Row="0" Grid.Column="0" Content="Weekly" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
     <DataGrid x:Name="CalendarDataGrid" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False"> 
      <DataGrid.Columns> 
       <DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}" /> 
       <DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/> 
       <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/> 
      </DataGrid.Columns> 
     </DataGrid> 

     <Grid Grid.Row="1" Grid.Column="2"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="70"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <Label Grid.Row="0" Content="Day" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/> 
      <Label Grid.Row="1" Content="Time" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/> 
      <Label Grid.Row="2" Content="Value" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/> 

      <ComboBox Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Width="100" Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/> 
      <TextBox Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=Time, Mode=TwoWay}"/> 
      <TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Height="23" TextWrapping="Wrap" Width="100" Text="{Binding Path=Value, Mode=TwoWay}"/> 

     </Grid> 
    </Grid> 
</Grid> 

+0

Попробуйте вызвать 'mySortedCalenderItems.Refresh(); 'в событии' SelectionChanged' 'ComboBox' –

+0

Если MainGrid является родителем DataGrid, нет необходимости в CalendarDataGrid.ItemsSource = mySortedCalenderItems; – Maximus

+0

Обновление вызова при событии SelectionChanged дает мне эту ошибку: «Обновить» не разрешено во время транзакции AddNew или EditItem. – b2f

ответ

0

Код выпадающий в XAML не настроен должным образом. Для правильной работы вам необходимо установить свойство SelectedValue. (Возможно, это нужно немного подкорректировать, но это дает вам идею).

<ComboBox ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" 
         SelectedValue="{Binding Path=Day, Mode=TwoWay}" /> 

Позвольте мне привести пример один выпадающий изменения другого ...

Например у меня есть этот тип данных:

public class PriceItem 
{ 
    public string Name { get; set; } 
    public int Price { get; set; } 
} 

и здесь приведен список данных значений, сохраненных на моей виртуальной машине, как Items.

Items = new List<PriceItem>() 
{ 
    new PriceItem() { Name = "Alpha", Price=100 }, 
    new PriceItem() { Name = "Beta", Price=200 }, 
}; 

Сценарий Два комбо-боксы, как связанные с данными Items. В одном поле со списком отображается Name в раскрывающемся списке, а в другом - Price. Компоновка Name контролирует поле со списком цены, когда оно меняет изменения цены.

<ComboBox x:Name="comboName" ItemsSource="{Binding Items}" DisplayMemberPath="Name" /> 
<ComboBox x:Name="comboValue" 
      ItemsSource="{Binding Items}" 
      DisplayMemberPath="Price" 
      SelectedValuePath="Price" 
      SelectedValue="{Binding SelectedItem.Price, ElementName=comboName, Mode=OneWay}"/> 

В действии оба поля со списком пустые. Но всякий раз, когда я выбираю первый, он меняет второй. Все используют одни и те же объекты данных/данных.

enter image description here

+0

Спасибо за информацию, но на самом деле это не исправляет мою проблему, которая является обновлением из коллекции CollectionViewSource. При изменении значения (день) в поле со списком также изменяется значение в Datagrid, но сортировка не запускается. При изменении значения (Day) в Datagrid непосредственно оно автоматически запускается. – b2f