DataGrid ListCollectionView сортировка - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть модель представления, которая предоставляет ListCollectionView и сетку данных, связанную с ним. По какой-то причине при обмене ListCollectionView и создании нового из исходной коллекции сортировка теряется для новых элементов, добавляемых в исходную коллекцию.

Исходная коллекция представляет собой ObservableCollection. Сортировка верна для элементов, которые уже существуют в исходной коллекции при создании ListCollectionView. Я не использую GetDefaultView, но вместо этого сам создаю ListCollectionView при необходимости. При добавлении новых элементов в исходную коллекцию сортировка не выполняется, и элементы появляются в конце списка. Я поднимаю INotifyPropertyChanged при замене ListCollectionView.

Кто-нибудь знает, почему у меня такое поведение?

1 Ответ

0 голосов
/ 21 апреля 2019

Возможно, проблема в том, что вы создаете свой список просмотра списка.(Вы должны были опубликовать этот код.)

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

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="100"/>
    </Grid.ColumnDefinitions>
    <Button Command="{Binding AddPersonCommand}" Grid.Column="1"/>
    <ListBox ItemsSource="{Binding People}"
             >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding LastName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

Viewmodel

public class MainWindowViewModel : BaseViewModel
{
    private RelayCommand addPersonCommand;
    public RelayCommand AddPersonCommand
    {
        get
        {
            return addPersonCommand
            ?? (addPersonCommand = new RelayCommand(
              () =>
             {
                 People.Add(new Person { FirstName = "Adam", LastName = "Barlow" });
             }
             ));
        }
    }
    private ObservableCollection<Person> people = new ObservableCollection<Person>();

    public ObservableCollection<Person> People
    {
        get { return people; }
        set { people = value; }
    }


    public ListCollectionView LCV { get; set; }
    public MainWindowViewModel()
    {
        LCV = (ListCollectionView)CollectionViewSource.GetDefaultView(People);
        LCV.SortDescriptions.Add(
            new SortDescription("LastName", ListSortDirection.Ascending));
        People.Add(new Person { FirstName = "Chesney", LastName = "Brown" });
        People.Add(new Person { FirstName = "Gary", LastName = "Windass" });
        People.Add(new Person { FirstName = "Liz", LastName = "McDonald" });
        People.Add(new Person { FirstName = "Carla", LastName = "Connor" });
    }
}

Когда я нажимаю кнопку, он добавляет Кена Барлоу к наблюдаемой коллекции, и он появляется в верхней части списка..

Я также попытался привязать к LCV:

И создать экземпляр, который пропускает людей через ctor.

public class MainWindowViewModel : BaseViewModel
{
    private RelayCommand addPersonCommand;
    public RelayCommand AddPersonCommand
    {
        get
        {
            return addPersonCommand
            ?? (addPersonCommand = new RelayCommand(
              () =>
              {
                  Person person = new Person { FirstName = "Adam", LastName = "Barlow" };
                  People.Add(person);
              }
             ));
        }
    }

    private ObservableCollection<Person> people = new ObservableCollection<Person>();

    public ObservableCollection<Person> People
    {
        get { return people; }
        set { people = value; }
    }

    public ListCollectionView LCV { get; set; }
    public MainWindowViewModel()
    {
        People.Add(new Person { FirstName = "Chesney", LastName = "Brown" });
        People.Add(new Person { FirstName = "Gary", LastName = "Windass" });
        People.Add(new Person { FirstName = "Liz", LastName = "McDonald" });
        People.Add(new Person { FirstName = "Carla", LastName = "Connor" });
        LCV = new ListCollectionView(People);
        LCV.SortDescriptions.Add(
            new SortDescription("LastName", ListSortDirection.Ascending));
    }
}

Это также работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...