DataContext Refresh и PropertyChanging & PropertyChanged Events - PullRequest
1 голос
/ 05 марта 2009

Я нахожусь в ситуации, когда мне сообщают из внешнего источника, что конкретная сущность была изменена за пределами моего текущего текста данных. Я могу найти сущность и вызвать обновление, например,

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, myEntity);

и свойства, которые были изменены на объекте, обновляются правильно. Однако ни один из INotifyPropertyChanging INotifyPropertyChanged, кажется, не поднимается, когда происходит обновление, и это оставляет мой интерфейс, отображающий неверную информацию.

Мне известно, что Refresh () не может использовать правильные методы получения и установки свойства для объекта, чтобы вызвать события уведомления об изменениях, но, возможно, есть другой способ выполнить то же самое?

Я что-то не так делаю? Есть ли лучший метод, чем Refresh? Если Refresh - единственный вариант, у кого-нибудь есть обходной путь?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

У меня была похожая проблема. Я связывался с 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();

Все элементы пользовательского интерфейса получают сообщение и обновляются соответствующим образом. Это работает даже для элементов управления древовидной структуры и тому подобного, когда вы не хотите, чтобы интерфейс «сбрасывался» при обновлении привязок.

0 голосов
/ 05 марта 2009

Если вы знаете, что вызываете Refresh (), почему бы просто не обновить и все равно обновить интерфейс в этот момент?

PropertyChanging и PropertyChanged вызываются путем вызова установщика в классе сущностей, сгенерированном DBQ LINQtoSQL. Вызов 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();
        }
    }
}
...