/ / Collectionviewsource - власником є ​​різні Thread - wpf, багатопотоковість, відправка

Collectionviewsource - володіє різними темами - wpf, багатопотоковість, відправлення

я отримав тут нову проблему. Я отримав MainWindow, в якому ContentGrid, а в цьому Frame. Зараз я створив різні Сторінки, які можна показати в цій "області вмісту". На одній із цих сторінок є сітка даних, прив’язана до CollectionViewSource, джерелом якої є база даних (через EntityFramework). Тепер, коли відбувається зміна цієї таблиці бази даних (вирішується за допомогою ServiceBroker та SQLDependency, спрацювання працює нормально) Datagrid потрібно оновити. Тепер проблема: Подія "Dependency_OnChange" працює вMainWindow-Thread. Коли я намагаюся отримати доступ до CollectionViewSource сторінки, щоб оновити його (cvs.View.Refresh), я отримую виняток, що це неможливо, оскільки інша нитка, яка володіє цим CVS.

Я спробував це з різною відправленням, як:

Application.Current.Dispatcher.Invoke((Action)(()=>
{
cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200);
cvs.View.Refresh();
}));

Цей Codeblock не приносить винятків, але я також не оновлюю інтерфейс ... Здається, він нічого не робить.

Чи може хто-небудь мені допомогти?

Відповіді:

1 для відповіді № 1

Ваша сітка даних оновиться, якщо ваш запит LINQ оцінить. Зараз він просто вказує LINQ IEnumerable, але не оцінює його.

    cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200).ToList();

повинен зробити оцінку LINQ для вас ...

Хоча я повинен сказати вашу cvs.View.Refresh() дзвінок дуже дорогий, оскільки призводить до оновлення всієї сітки. Можливо, вам доведеться розглянути кращий дизайн тут.

Чому ви не встановлюєте dataGrid.ItemsSource = _db.Table.DefaultView як джерело елемента безпосередньо до сітки даних. Я думаю, якщо ваша таблиця оновлюється (і виглядає _db.Table.AcceptChanges();) подання автоматично повідомляє про зміни в сітці, і сітка, можливо, оновлюється швидше!

Але це лише моя думка, оскільки я не знаю вашого контексту потоків тут. Але все-таки спробуйте дати мені знати.