Как получить доступ к отправителю 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.