Как получить доступ к отправителю OLVColumn внутри ImageGetterDelegate

У меня есть проблема при создании динамически генерируемых столбцов в моем ObjectListView с помощью ImageGetterDelegate, используемого для установки изображения, отображаемого в этом поле. При попытке сделать следующее:

myOLVColumn.ImageGetter = delegate(Object x) { /*can't access myOLVColumn here*/ return getImage(x); };

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

Возможно, решение использует какое-то событие, которое я пока не смог найти вместо делегата. Кто-нибудь знает, можно ли получить доступ к объекту столбца внутри делегата или установить изображение поля на основе свойств столбца любым другим динамическим способом? если да, то как?

Если это невозможно, было бы здорово, если бы они изменились:

 public delegate object ImageGetterDelegate(object rowObject);

в

public delegate object ImageGetterDelegate(object rowObject, object sender);

1 ответ

Решение

Я нашел решение самостоятельно!

Я могу создать объект до определения делегата, а затем без проблем использовать этот объект внутри делегата! Он будет сохранен как указатель в определении делегата.

foreach (DirectoryInfo dir in directoryList.GetDirectories())
{
    BrightIdeasSoftware.OLVColumn myOLVColumn = new BrightIdeasSoftware.OLVColumn();
    myOLVColumn.ImageGetter = delegate(Object x) {
        /*I CAN access myOLVColumn here, 
as far as I don't mess with that object in the other code, 
and even if the for loop changes myOLVColumn, as far as it makes a new one and don't destroy it
the delegate will still have the pointer to the object the variable pointed to 
during the generation of the delegate*/
        return getImage(x, myOLVColumn);
    };
    //...
}

Сборщик мусора не удалит этот объект myOLVColumn, потому что на него указывает объект делегата.

Этот прием не очень хорошо работает с примитивными типами, потому что любое изменение в этой переменной повлияет на все делегаты, так как они не являются указателями на объект, поэтому убедитесь, что используются деформирующие элементы (Int32 вместо int, String вместо string и т. Д. на).

В любом случае, это довольно сложно, поэтому, возможно, было бы хорошо, если бы определение делегата было расширено, при условии, конечно, что оно не слишком портит внутреннюю работу библиотеки ObjectListView.

Другие вопросы по тегам