2009-03-05 9 views
1

私は、特定のエンティティが現在のdatacontextの外で変更されていることを外部ソースから通知されている状況にあります。エンティティを見つけてリフレッシュを呼び出すことができます。DataContext RefreshとPropertyChanging&PropertyChangedイベント

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues、myEntity);

エンティティで変更されたプロパティが正しく更新されます。ただし、INotifyPropertyChanging INotifyPropertyChangedのどちらも、リフレッシュが発生したときに表示されないように見えます。これにより、UIに間違った情報が表示されてしまいます。

私はリフレッシュ()がエンティティ上で正しい通知を受け取るのに失敗し、変更通知イベントを発生させることはできませんが、同じことを達成する別の方法があると思いますか?

何か間違っていますか? Refreshよりも良い方法はありますか? リフレッシュが唯一のオプションであれば、誰でも回避できますか?

答えて

2

私は同様の問題がありました。私はTreeViewにバインドしていたため、編集操作を取り消したユーザーに応答してRefreshを呼び出す必要がありました。 Refresh()メソッドは、素直にすべての元の値を戻しますが、これは私のTreeView UIに反映されませんでした。全能のグーグルと相談した後、私は、このソリューションに出くわした:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh(); 

これがすべてを更新するために、私のツリービューを強制するようです。唯一の欠点(それはかなり主要なものです)は、すべてのツリーノードを崩壊させるように見えるため、ユーザーは自分の場所を失うことになります。私はItemsSourceをヌルに設定して、同じ効果を戻すことができますが、バインドされたテキストボックスなどがあれば、このメソッドは単純になりますが、1つ1つずつリバインドする必要はないためです。

これよりも優れた解決策はありますか?

EDITED: はい、あります...私の

賢く、より-私の同僚は、トリックを行うようだこの解決策、思い付きました。

context.Refresh(RefreshMode.OverwriteCurrentValues, employee); 
employee.SendPropertiesChanged(); 

すべてのUI要素がメッセージを取得し、適切に自分自身を更新:

public void SendPropertiesChanged() 
{ 
    foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties()) 
    SendPropertyChanged(prop.Name); 
} 

ザ・あなたは自分のアプリケーションのコードでこれを呼び出すことができます。Linq2Sqlオブジェクトのためのあなたの部分クラスでは、次のコードを追加します。これは、ツリービューのコントロールや、UIをバインディングをリフレッシュするときに「リセット」するようにしたくない場所でも機能します。

0

Refresh()を呼び出すことがわかっている場合は、その時点でUIをリフレッシュしてください。

PropertyChangingとPropertyChangedは、LINQtoSQL DBML生成エンティティクラスでsetterを呼び出すことによって呼び出されます。 Refresh()を呼び出すとそのようにはなりません:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)] 
public string DisplayName 
{ 
    get 
    { 
     return this._DisplayName; 
    } 
    set 
    { 
     if ((this._DisplayName != value)) 
     { 
      this.OnDisplayNameChanging(value); 
      this.SendPropertyChanging(); 
      this._DisplayName = value; 
      this.SendPropertyChanged("DisplayName"); 
      this.OnDisplayNameChanged(); 
     } 
    } 
} 
+0

Rex、 Refresh()はコントローラー/「ほぼビジネスレイヤー」レベルで行われ、UIの近くにはありませんので、手動によるリフレッシュは問題ありません。 Refresh()によってEnitityデータが変更された場合、変更されたイベントが発生するはずです。実際にはそれが行われないという事実は、私にとっては見逃しのようです。 – Scott

+0

@Scott多分それは見落としですが、それは私たちが変更できないコードですが、あなたのものはそうです。なぜあなたはRefresh()を呼び出してUIからそれにアタッチするときに呼び出すDataContextクラスにイベントを追加しないのですか?これはエンティティのイベントから取得するSoCに近いものです。 –

関連する問題