2009-05-12 4 views
2

Я определил следующий вид:Invalidate CollectionViewSource

<CollectionViewSource x:Key="PatientsView" Source="{Binding Source={x:Static Application.Current}, Path=Patients}"/> 

Где Пациентка следующее свойство:

public IEnumerable<Patient> Patients 
{ 
    get 
    { 
     return from patient in Database.Patients 
       orderby patient.Lastname 
       select patient; 
    } 
} 

Где-то в моем коде, я изменить базу данных пациентов, и я хочу, чтобы иметь элементы управления, которые отображают эти данные (используя «PatientsView»), будут автоматически уведомлены. Каков правильный способ сделать это? Может ли CollectionViewSource быть недействительным или что-то еще?

ответ

2

Я думаю, что это немного сложнее, чем кажется. Уведомление вашего клиентского приложения об изменениях в базе данных - нетривиальная задача. Но ваша жизнь проще, если база данных изменяется только из вашего приложения - это позволяет вам «обновлять логику» всякий раз, когда вы меняете базу данных.

Ваше свойство «Пациенты», кажется, присутствует в одном классе (возможно, немного больше одного? :)). И вы, вероятно, свяжете ListBox с CollectionViewSource. Поэтому вместо вызова Refresh на CollectionViewSource вы можете заставить WPF повторно вызвать получателя. Для этого класс, обладающий свойством Patients, должен реализовать интерфейс INotifyPropertyChanged.

код будет выглядеть следующим образом:

public class TheClass : INotifyPropertyChanged 
{ 
public IEnumerable<Patient> Patients 
    { 
    get 
    { 
      return from patient in Database.Patients 
        orderby patient.Lastname 
        select patient; 
    } 
    } 

#region INotifyPropertyChanged members 
// Generated code here 
#endregion 

public void PatientsUpdated() 
{ 
    if (PropertyChanged != null) 
    PropertyChanged(this, "Patients"); 
} 
} 

Теперь вызовите PatientsUpdated() на экземпляре TheClass для запуска обновления связывания.

P.S. Сказав все, что-то похоже на плохой дизайн.

+0

Все мои изменения выполняются локально в приложении, поэтому я могу добавить логику обновления. Однако вызов Refresh() не имеет никакого эффекта! –

+0

Я изменил свой пост с еще несколькими мыслями. – arconaut

+0

Это он. Все еще не знаю, почему Refresh() не работает, но это работает отлично! Спасибо –

0

Table<T> не поддерживает IListChanged событий, вам придется сделать это самостоятельно (я должен был сделать то же самое раньше сегодня).

8

Как недействительным CollectionViewSource в код:

CollectionViewSource patientsView = FindResource("PatientsView") as CollectionViewSource; 
patientsView.View.Refresh(); 
+0

Я пробовал этот код. Ничего не происходит, когда вызывается обновление! Я установил точку останова на свой объект Patients: он не вызывается, когда вызывается Refresh(). –

+0

Работает как шарм. Благодаря! –