Добавление объектов в CollectionView внутри ObservableCollection

143
24 апреля 2021, 19:30

Не могу добавить объект в CollectionView, которая находится внутри объекта, который находится в ObservableCollection. Много прошерстил интернетов, натыкался на объяснения о разности потоков UI и VM, пробовал советы с получением основного потока - не получилось.

xaml

<UserControl>
   <UserControl.Resources>
      <local:GlossaryViewModel x:Key="ViewModel"/>
   </UserControl.Resources>
   <UserControl.DataContext>
      <StaticResource ResourceKey="ViewModel"/>
   </UserControl.DataContext>
   <ItemsControl ItemsSource="{Binding GlossaryGroupCollection}">                   
      <ItemsControl.ItemTemplate>
        <DataTemplate>                          
          <Expander> 
            <!-- условно -->
            <Button Command="{Binding AddItemCommand}"/> 
            <ListBox ItemsSource="{Binding CurItemsView}"/>
          </Expander> 
        </DataTemplate> 
     </ItemsControl.ItemTemplate>
  </ItemsControl> 
</UserControl>

GlossaryViewModel

public ObservableCollection<GlossaryGroup> GlossaryGroupCollection => MainWorker.GlossaryGroupCollection;
//MainWorker - статичный класс с коллекцией

GlossaryGroup

public ICollectionView CurItemsView { set; get; } 
public ObservableCollection<IBaseItem> CurItems { set; get; } = new ObservableCollection<IBaseItem>();
public IDelegateCommand AddItemCommand { protected set; get; }
private void AddItemExecute(object param)
{
   /*
   ошибка: System.NotSupportedException: "Данный тип CollectionView не 
   поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher."
   */
   CurItems.Add(new GlossaryItem { Name = $"Элемент {CurItems.Count + 1}" });
}
public GlossaryGroup()
{
   AddItemCommand = new DelegateCommand(AddItemExecute);
   CurItemsView = CollectionViewSource.GetDefaultView(CurItems);
   CurItemsView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
   CurItemsView.Filter = Filter;
}

Изначально GlossaryGroupCollection тоже делал CollectionView и туда объекты нормально добавлялись, а здесь не постижимая для меня проблема с потоками. Один товарищ в одной из похожих тем "просто сделал" вызов команды не асинхронным как я понял (IsAsync?). Мне не помогло.

Я пробовал класс из этого ответа https://stackoverflow.com/a/5781974/10987751 Но я не понял пояснение: You need to supply a delegate to either the Invoke or BeginInvoke method of the Dispatcher associated with the UI thread.

Сделал на Click кнопки и событие из xaml.cs Всё равно ошибка.

private void AddItem(object sender, RoutedEventArgs e)
{
   var collection = ((Button) sender).DataContext as GlossaryGroup;
   Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
     {
       collection.CurItems.Add(new GlossaryItem());
     });
}
Answer 1

внутри темплейта добавил создание CollectionView, а не в коде и все нормально. Конфликтов с потоками нет (проблемы с фильтрацией могут появится из-за этого).

<CollectionViewSource Source="{Binding CurItems}" x:Key="cvs">
     <CollectionViewSource.SortDescriptions>
          <scm:SortDescription PropertyName="Name"/>
     </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

или просто вот так:

public IEnumerable<IBaseItem> FilteredCollection 
{ 
   get { return CurItems.Where(i => i.Name.Contains(FilterString)).OrderBy(n=>n.Name); } 
} 
READ ALSO
Как использовать ключ RSA в AES шифрование?

Как использовать ключ RSA в AES шифрование?

Никак не могу сообразить как мне правильно сделать реализацию чтобы впихнуть ключ RSA 2048 в шифрование AES

103
Ошибка в запросе SQL (MySql 8.0.17) | C#

Ошибка в запросе SQL (MySql 8.0.17) | C#

Я пытаюсь сделать SELECT * FROM member WHERE id = 627528083 запрос к базе данных, но мне выдаёт ошибку синтаксиса в строке 41, почему?

92
Зачем создавать програмно, если есть дизайнер форм?

Зачем создавать програмно, если есть дизайнер форм?

Прошу внести ясностьЯ начал изучение с# с консоли что не удивительно

97
С#. Использование закрытых элементов в классах-наследниках

С#. Использование закрытых элементов в классах-наследниках

Доброго времени суток участники форумаСтолкнулся с проблемой при изучении языка C#

88