2012-05-11 2 views
1

У меня возникла новая проблема. Ive получил MainWindow, в котором есть ContentGrid, и в этом есть Frame. Теперь ive создал разные страницы, которые можно показать в этой «контент-области». На одной из этих страниц есть Datagrid, связанный с CollectionViewSource, источником которого является база данных (через EntityFramework). Теперь, когда происходит изменение в этой таблице базы данных (решается через ServiceBroker и SQLDependency, срабатывание работает отлично) Datagrid должен обновляться. Теперь проблема: «Dependency_OnChange» -Event работает в MainWindow-Thread. Когда я пытаюсь получить доступ к CollectionViewSource страницы для обновления (cvs.View.Refresh), я получаю исключение, что это невозможно, избавиться от другого Thread, который владеет этим CVS.Collectionviewsource - разные темы принадлежат его

Ive пробовал с разными Диспетчерская как:

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

Это оленья кожа кодоблок приносит исключение, но я не буду обновлять UI слишком ... Кажется, что он ничего не делает.

Может ли кто-нибудь мне помочь?

ответ

1

Ваша сетка данных будет обновляться, если ваш запрос LINQ будет оцениваться. Сейчас он просто указывает LINQ IEnumerable, но не оценивает его.

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

должен сделать оценку LINQ для вас ...

Хотя я должен сказать, ваш cvs.View.Refresh() звонок очень дорого, поскольку это вызывает всю сетку, чтобы обновить. Возможно, вам стоит рассмотреть лучший дизайн здесь.

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

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

+0

Эй, спасибо за ваш кончик, но когда я устанавливаю ItemsSource из Datagrid непосредственно в базу данных с этим: 'datagrid.ItemsSource = _db.Table;' тогда DataGrid ** оленья кожа **»обновлениями автоматически, когда новый запись в базе данных написана ... :( – mj2k2

+0

Вы пытались 'Table.AcceptChanges()' когда вы получаете это событие обновления БД? Также если это не работает, попробовали ли вы мой оригинальный совет о '.ToList() '? –

+0

Did not work too ... :( – mj2k2

Смежные вопросы