Как создать WPF ListCollectionView для сортировки DataGrid CollectionViewSources - PullRequest
2 голосов
/ 15 декабря 2011

Вот мои CollectionViewSources:

<CollectionViewSource x:Key="topLevelAssysViewSource" d:DesignSource="{d:DesignInstance my:TopLevelAssy, CreateList=True}" />
<CollectionViewSource x:Key="topLevelAssysRefPartNumsViewSource" Source="{Binding  Path=RefPartNums, Source={StaticResource topLevelAssysViewSource}}" />
<CollectionViewSource x:Key="topLevelAssysRefPartNumsRefPartNumBomsViewSource" Source="{Binding Path=RefPartNumBoms, Source={StaticResource topLevelAssysRefPartNumsViewSource}}" />

В настоящее время у меня есть следующие элементы управления передачей данных друг другу:

DataContext для моего окна подается через сетку, в которой находятся все мои элементы управления:

<Grid DataContext="{StaticResource topLevelAssysViewSource}">

ComboBox:

<ComboBox DisplayMemberPath="TopLevelAssyNum" Height="23" HorizontalAlignment="Left"   ItemsSource="{Binding}" Margin="12,12,0,0" Name="topLevelAssysComboBox" SelectedValuePath="TopLevelAssyID" VerticalAlignment="Top" Width="120" />

Список:

<ListBox DisplayMemberPath="RefPartNum1" Height="744" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource topLevelAssysRefPartNumsViewSource}}" Margin="12,41,0,0" Name="refPartNumsListBox" SelectedValuePath="RefPartNumID" VerticalAlignment="Top" Width="120" />

Наконец, DataGrid, который я пытаюсь сделать способным к сортировке: (Пока только один столбец):

<DataGrid CanUserSortColumns="true"  AutoGenerateColumns="False" EnableRowVirtualization="True" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource topLevelAssysRefPartNumsRefPartNumBomsViewSource}}" Margin="6,6,0,1" Name="refPartNumBomsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="707">
    <DataGrid.Columns >
        <DataGridTextColumn x:Name="cageCodeColumn" Binding="{Binding Path=CageCode}" Header="CageCode" Width="45"  />
        <DataGridTextColumn x:Name="partNumColumn" Binding="{Binding Path=PartNum}" Header="PartNum" Width="165" SortDirection="Ascending" />
    </DataGrid.Columns>
</DataGrid>

Мой точный код до сих пор:

public partial class MainWindow : Window
{
    racr_dbEntities racr_dbEntities = new racr_dbEntities();

    public MainWindow()
    {
        InitializeComponent();
    }

    private System.Data.Objects.ObjectQuery<TopLevelAssy> GetTopLevelAssysQuery(racr_dbEntities racr_dbEntities)
    {
        // Auto generated code

        System.Data.Objects.ObjectQuery<racr_dbInterface.TopLevelAssy> topLevelAssysQuery = racr_dbEntities.TopLevelAssys;
        // Update the query to include RefPartNums data in TopLevelAssys. You can modify this code as needed.
        topLevelAssysQuery = topLevelAssysQuery.Include("RefPartNums");
        // Update the query to include RefPartNumBoms data in TopLevelAssys. You can modify this code as needed.
        topLevelAssysQuery = topLevelAssysQuery.Include("RefPartNums.RefPartNumBoms");
        // Returns an ObjectQuery.
        return topLevelAssysQuery;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // Load data into TopLevelAssys. You can modify this code as needed.
        CollectionViewSource topLevelAssysViewSource = ((CollectionViewSource)(this.FindResource("topLevelAssysViewSource")));
        ObjectQuery<racr_dbInterface.TopLevelAssy> topLevelAssysQuery = this.GetTopLevelAssysQuery(racr_dbEntities);
        topLevelAssysViewSource.Source = topLevelAssysQuery.Execute(MergeOption.AppendOnly);

         ListCollectionView topLevelAssyView = CollectionViewSource.GetDefaultView(CollectionViewSource.CollectionViewTypeProperty) as ListCollectionView;
        topLevelAssyView.SortDescriptions.Add(new SortDescription("PartNum", ListSortDirection.Descending));
    }

Я прочитал и понял важность создания ListCollectionViews для обработки свойств сортировки, включенных в CollectionViewSource, который я получил из блога Блог Беа Штольниц .

Тем не менее, я получаю сообщение об ошибке Null Reference Exception Unhandled: «Ссылка на объект не установлена ​​для экземпляра объекта».

Как мне решить эту проблему? Нужно ли мне дополнительно определять мой ListCollectionView или, возможно, мне нужно установить ICollectionView? Мой столбец PartNum содержит номера деталей, которые начинаются с цифр, а иногда и букв. Будут ли применяться стандартные правила сортировки?

1 Ответ

0 голосов
/ 15 декабря 2011

Пожалуйста, предоставьте полную трассировку стека для исключения или, по крайней мере, номер строки в вашем примере, которая выдает это исключение.

Исходя из того, что вы предоставили, я думаю, что источником ошибки является

ListCollectionView topLevelAssyView = CollectionViewSource.GetDefaultView(CollectionViewSource.CollectionViewTypeProperty) as ListCollectionView;

Если вы используете Entity Framework, представлением по умолчанию для результатов ObjectQuery не будет ListCollectionView, следовательно, NullReferenceException.

Чтобы использовать ObjectQuery / EntityCollection в качестве источника для CollectionViewSource и сортировать с ним, вам нужно обернуть его в какой-то другой контейнер, поддерживающий сортировку (и, если вы хотите выполнять CRUD, везде использовать этот контейнер вместо исходного EntityCollection).

Например, попробуйте что-нибудь в этом духе:

ObservableCollection<TopLevelAssy> observableCollection = new ObservableCollection(topLevelAssysQuery.Execute(MergeOption.AppendOnly));
((ISupportInitialize)topLevelAssysViewSource).BeginInit();
topLevelAssysViewSource.CollectionViewType = typeof(ListCollectionView);
topLevelAssysViewSource.Source = observableCollection;
topLevelAssysViewSource.SortDescriptions.Add(new SortDescription("CageCode", ListSortDirection.Ascending));
((ISupportInitialize)topLevelAssysViewSource).EndInit();

И измените привязку, указав свойство CollectionViewSource.View:

ItemsSource="{Binding Source={StaticResource topLevelAssysViewSource}, Path=View}"

Дополнительное чтение: http://blog.nicktown.info/2008/12/10/using-a-collectionviewsource-to-display-a-sorted-entitycollection.aspx

...