У меня была похожая проблема. Я связывался с TreeView и должен был вызвать Refresh в ответ на отмену пользователем операции редактирования. Метод Refresh()
послушно возвращает все исходные значения обратно, но это не было отражено в моем TreeView UI. Посоветовавшись со всемогущим Google, я наткнулся на это решение:
CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();
Кажется, это заставляет мой TreeView обновлять все. Единственный недостаток (и он довольно серьезный) заключается в том, что он, кажется, разрушает все узлы дерева, что приводит к тому, что пользователь теряет свое место. Я мог бы также установить мой ItemsSource
на ноль и обратно ... тот же эффект, хотя этот метод был бы проще, если бы у вас было несколько связанных текстовых полей или что-то в этом роде, так как вам не нужно было бы повторно привязывать каждый из них .
Есть ли лучшее решение, чем это?
Редакция:
Да, есть ...
Мой умный коллега придумал это решение, которое, похоже, помогает. В ваш частичный класс для объекта Linq2Sql добавьте следующий код:
public void SendPropertiesChanged()
{
foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties())
SendPropertyChanged(prop.Name);
}
Вы можете просто позвонить по этому номеру в коде приложения:
context.Refresh(RefreshMode.OverwriteCurrentValues, employee);
employee.SendPropertiesChanged();
Все элементы пользовательского интерфейса получают сообщение и обновляются соответствующим образом. Это работает даже для элементов управления древовидной структуры и тому подобного, когда вы не хотите, чтобы интерфейс «сбрасывался» при обновлении привязок.