PropertyGrid: получение уведомлений PropertyValueChanged из CollectionEditor - PullRequest
1 голос
/ 12 ноября 2008

Элемент управления PropertyGrid очень полезен для редактирования объектов во время выполнения. Я использую это следующим образом:

Form form = new Form();
form.Parent = this;
form.Text = "Editing MyMemberVariable";

PropertyGrid p = new PropertyGrid();
p.Parent = form;
p.Dock = DockStyle.Fill;
p.SelectedObject = _MyMemberVariable;
p.PropertyValueChanged += delegate(object s, PropertyValueChangedEventArgs args) 
{ 
    _MyMemberVariable.Invalidate(); 
};

form.Show();

Как видите, я использую уведомление PropertyValueChanged, чтобы выяснить, когда обновлять _MyMemberVariable. Тем не менее, _MyMemberVariable - это класс, который я не написал, и один из его членов имеет тип Collection. PropertyGrid вызывает Редактор Коллекции для редактирования этого типа. Однако, когда редактор коллекции закрыт, я не получаю PropertyValueChanged уведомление.

Очевидно, я мог бы обойти эту проблему, используя ShowDialog() и аннулируя _MyMemberVariable после закрытия диалога.

Но я бы хотел, чтобы на самом деле PropertyValueChanged события срабатывали при редактировании коллекций. Есть ли способ сделать это без изменения _MyMemberVariable (у меня нет доступа к его исходному коду)?

Ответы [ 2 ]

2 голосов
/ 06 августа 2013

Это не очень элегантно, но это решило проблему, с которой я столкнулся, когда кто-то обновляет / изменяет порядок коллекции из сетки свойств:

propertyGrid1.PropertyValueChanged += (o, args) => PropertyGridValueChanged();
propertyGrid1.LostFocus += (sender, args) => PropertyGridValueChanged();

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

0 голосов
/ 12 ноября 2008

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

Здесь идет

Проблему легко воспроизвести, создав новый проект формы Windows, добавив в форму сетку свойств и список и установив список в качестве выбранного объекта сетки свойств.

//designer code excluded
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        propertyGrid1.SelectedObject = listBox1;

        propertyGrid1.PropertyValueChanged += delegate(object s, PropertyValueChangedEventArgs args)
        {
            MessageBox.Show("Invalidate Me!");
        };

    }
}

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

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

Надеюсь, это поможет кому-то еще выяснить вашу проблему.

-jeremy

...