2009-05-12 14 views
2

私は次のビュー定義しました:無効化CollectionViewSource

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

私のコードのどこかに、私は患者のデータベースを変更し、私が持ちたい:患者は、次のプロパティである

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

をこのデータを表示するコントロール( "PatientsView"を使用)に自動的に通知されます。これを行う適切な方法は何ですか? CollectionViewSourceを無効にすることはできますか?

答えて

2

:どのように背後にあるコードでCollectionViewSourceを無効にする

+0

すべての変更はアプリケーションでローカルに行われるため、リフレッシュロジックを追加できます。ただし、Refresh()を呼び出しても効果はありません。 –

+0

私はいくつかのより多くの考えで自分の投稿を修正しました。 – arconaut

+0

これはそれです。まだRefresh()がうまくいかない理由は分かりませんが、これはうまくいきます!ありがとう –

0

Table<T>は、IListChangedイベントをサポートしていません。あなたはこれを自分で行う必要があります(今も同じことをやっていなければなりません)。私は、これはもう少しそれはそうよりも複雑だと思う

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

。クライアントアプリケーションにデータベースの変更について通知することは、重要ではありません。しかし、データベースがアプリケーションからのみ変更されると、あなたの人生はより簡単になります。これにより、データベースを変更するたびに「リフレッシュロジック」を置くことができます。

あなたの「患者」プロパティは1つのクラスに存在するようです(おそらく1つ以上です:)。おそらくListBoxをCollectionViewSourceにバインドします。したがって、CollectionViewSourceでRefreshを呼び出す代わりに、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"); 
} 
} 

を今、バインディングの更新をトリガするためにするtheClassのインスタンスにPatientsUpdated()を呼び出します。

P.S.どういうわけか、悪いデザインのように感じるだけのことを言ってしまった。

+0

私はこのコードを試しました。リフレッシュが呼び出されたときに何も起こりません! Patientsプロパティにブレークポイントを設定しました.Lefresh()が呼び出されたときに呼び出されません。 –

+0

魅力的に機能します。ありがとう! –