2

外部ソースから、特定のエンティティが現在のデータコンテキスト外で変更されたという通知を受けている状況にあります。エンティティを見つけて、そのように更新を呼び出すことができます

MyDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myEntity);

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

Refresh() がエンティティで正しいプロパティ ゲッターとセッターを使用して変更通知イベントを発生させられないことは承知していますが、同じことを達成する別の方法があるのではないでしょうか?

私は何か間違ったことをしていますか?リフレッシュよりも良い方法はありますか? 更新が唯一のオプションである場合、誰かが回避策を持っていますか?

4

2 に答える 2

3

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

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

これにより、TreeViewがすべてを更新するように強制されているようです。唯一の欠点(そしてそれはかなり大きな欠点です)は、すべてのツリーノードが折りたたまれているように見えることです。これにより、ユーザーは場所を失うことになります。nullに設定ItemsSourceして、もう一度元に戻すこともできます...同じ効果ですが、バインドされたテキストボックスなどがたくさんある場合は、すべてを再バインドする必要がないため、この方法の方が簡単です。

これよりも良い解決策はありますか?

編集済み:はい、あります...

私より賢い同僚がこの解決策を思いついたのですが、それでうまくいくようです。Linq2Sqlオブジェクトの部分クラスに、次のコードを追加します。

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

アプリケーションコードでこれを呼び出すことができます。

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

すべてのUI要素がメッセージを受け取り、適切に更新します。これは、ツリービューコントロールなど、バインディングを更新したときにUIが「リセット」されたように見せたくない場合にも機能します。

于 2010-04-22T13:49:51.963 に答える
0

Refresh() を呼び出すことがわかっている場合は、とにかく先に進んでその時点で UI を更新してみませんか?

PropertyChanging と PropertyChanged は、LINQtoSQL DBML で生成されたエンティティ クラスでセッターを呼び出すことによって呼び出されます。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();
        }
    }
}
于 2009-03-05T03:10:35.387 に答える