Как определить, когда элемент управления PropertyGrid собирается изменить свойство объекта - PullRequest
2 голосов
/ 11 октября 2009

У меня есть элемент управления, расширяющий PropertyGrid, который позволяет пользователям устанавливать свойства некоторых объектов моей программы. У этих объектов есть событие, которое вызывается при изменении одного из их свойств, и PropertyGrid подписывается на это событие, так что оно обновляется при изменении свойства. Моя проблема возникает, когда выбрано большое количество объектов, и пользователь устанавливает свойство для всех объектов одновременно. Элемент управления забивается запросами Refresh (), которые занимают много времени (например, установка свойства для ~ 300 объектов занимает около 20 секунд с включенной функцией автообновления и всего лишь долю секунды при его включении). выкл).

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

override void OnSetPropertyStart()
{
    suppressRefresh = true;
}
override void OnSetPropertyEnd()
{
    suppressRefresh = false;
}

К сожалению, это не так. Есть ли другой способ определить, когда сетка свойств задает свойство, или иным образом добиться того же эффекта?

1 Ответ

1 голос
/ 11 октября 2009

Тип под вашим контролем? Вы могли бы добавить пару событий FooUpdating / FooUpdated? Другой вариант - написать пользовательскую модель свойств с TypeDescriptionProvider, но я подозреваю, что это будет довольно много работы. Моя первая попытка была бы до / после пары ...

Нечто подобное (обновлено для отображения подхода 3.5; см. Историю для примера 2.0):

class MyType : INotifyPropertyChanged, INotifyPropertyChanging
{
    public event PropertyChangedEventHandler PropertyChanged;
    public event PropertyChangingEventHandler PropertyChanging;

    protected void UpdateField<T>(ref T field, T newValue, string propertyName)
    {
        if (!EqualityComparer<T>.Default.Equals(field, newValue))
        {
            OnPropertyChanging(propertyName);
            field = newValue;
            OnPropertyChanged(propertyName);
        }
    }
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this,
            new PropertyChangedEventArgs(propertyName));
    }
    protected void OnPropertyChanging(string propertyName)
    {
        PropertyChangingEventHandler handler = PropertyChanging;
        if (handler != null) handler(this,
            new PropertyChangingEventArgs(propertyName));
    }
    private string name;

    public string Name
    {
        get { return name; }
        set { UpdateField(ref name, value, "Name"); }
    }
    private DateTime dateOfBirth;
    public DateTime DateOfBirth
    {
        get { return dateOfBirth; }
        set { UpdateField(ref dateOfBirth, value, "DateOfBirth"); }
    }
}

Затем просто обработайте два события и включите / отключите обновления соответствующим образом.

...