я отримав тут нову проблему. Я отримав 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();
) подання автоматично повідомляє про зміни в сітці, і сітка, можливо, оновлюється швидше!
Але це лише моя думка, оскільки я не знаю вашого контексту потоків тут. Але все-таки спробуйте дати мені знати.