Создать SharePoint (2010) ToolPart для нескольких веб-частей
Я использую основные инструкции ( здесь) для создания свойства, управляемого настраиваемой ToolPart.
Все хорошо, за исключением части, где для доступа к свойству webpart в методе ApplyChanges я должен привести "this.ParentToolPane.SelectedWebPart" обратно к конкретному классу "SimpleWebPart".
public override void ApplyChanges()
{
SimpleWebPart wp1 = (SimpleWebPart)this.ParentToolPane.SelectedWebPart;
// Send the custom text to the Web Part.
wp1.Text = Page.Request.Form[inputname];
}
Это означает, что я должен связать каждую часть инструментов с определенной веб-частью. Есть ли способ лучше? Я не могу создать интерфейс, так как нет способа указать свойство в одном.
Я неумело пытался передать событие / обработчик событий во время создания инструментальной части, но это не обновило свойство веб-части при вызове.
Я мог бы создать базовый класс для всех веб-частей, которые имеют общедоступное свойство "Текст", но это бесполезно.
Я мог бы также впасть в отчаяние и взломать ссылку this.ParentToolPane.SelectedWebPart с помощью Reflection и таким образом вызвать любые свойства с именем "Text".
В любом случае, я смотрю сквозь дуло небольшого количества болтовни, только чтобы узнать, что каждый вариант - тупик.
Кто-нибудь сделал это и может порекомендовать правильный метод для создания многоразовой инструментальной части?
1 ответ
Я использовал интерфейс вместо конкретного экземпляра веб-части.
private class IMyProperty
{
void SetMyProperty(string value);
}
public override void ApplyChanges()
{
IMyProperty wp1 = (IMyProperty)this.ParentToolPane.SelectedWebPart;
// Send the custom text to the Web Part.
wp1.SetMyProperty(Page.Request.Form[inputname]);
}
Но это не дает предупреждения времени компиляции о том, что для инструментальной части требуется родительская веб-часть для реализации интерфейса IMyProperty.
Простым решением этого является добавление свойства интерфейса IMyProperty в конструктор панели инструментов и вызов этой ссылки вместо свойства this.ParentToolPane.SelectedWebPart.
public ToolPart1(IContentUrl webPart)
{
// Set default properties
this.Init += new EventHandler(ToolPart1_Init);
parentWebPart = webPart;
}
public override void ApplyChanges()
{
// Send the custom text to the Web Part.
parentWebPart.SetMyProperty(Page.Request.Form[inputname]);
}
public override ToolPart[] GetToolParts()
{
// This is the custom ToolPart.
toolparts[2] = new ToolPart1(this);
return toolparts;
}
Это прекрасно работает, но я не могу избавиться от ощущения, что в базовом коде SharePoint есть что-то неприятное, что может сбить меня с толку позже.