2009-05-12 47 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。因此,不要在CollectionViewSource上调用Refresh,而是让WPF重新调用getter。为此,具有患者属性的类必须实现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"); 
} 
} 

现在,在theClass描述的实例调用PatientsUpdated()来触发绑定的更新。

P.S.说了这么多,不知何故,这只是一种糟糕的设计。

+0

我的所有更改都是在应用程序的本地完成的,所以我可以添加刷新逻辑。但是,调用Refresh()不起作用! – 2009-05-12 14:09:22

+0

我修改了我的帖子,提供了更多的想法。 – arconaut 2009-05-12 14:48:49

+0

就是这样。仍然不知道为什么刷新()不起作用,但这工作正常!谢谢 – 2009-05-13 07:44:07

0

Table<T>不支持IListChanged事件,你将不得不自己做这件事(今天早些时候我必须这样做)。

8

如何在后面的代码无效一CollectionViewSource:

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

我试过这段代码。刷新被调用时没有任何反应!我在我的患者属性中设置了一个断点:当Refresh()被调用时,它不会被调用。 – 2009-05-12 14:01:36

+0

像魅力一样工作。谢谢! – 2011-08-17 13:15:11