同様の問題がありました。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が「リセット」されたように見せたくない場合にも機能します。