我使用基本说明(here)来创建由自定义ToolPart驱动的属性。
一切都很好,除了部分之外,为了访问ApplyChanges方法中的webpart属性,我必须将“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];
}
这样做意味着我必须将每个工具部分与特定的webpart配对。有没有更好的办法? 我无法创建一个接口,因为无法在一个属性中指定属性。
我在toolpart创建期间无法尝试传递事件/事件处理程序,但是在调用时没有更新webpart属性。
我可以为所有具有公共“Text”属性的webpart创建一个基类,但这很难看。
我也可以绝望地破解这个带有Reflection的this.ParentToolPane.SelectedWebPart引用并以这种方式调用任何名为“Text”的属性。
无论哪种方式,我都会盯着周围的一些人,只是发现每个选项都是死路一条。
有没有人这样做并且可以推荐用于创建可重复使用的工具包的正确方法?
答案 0 :(得分:0)
我使用了界面而不是webpart的特定实例。
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]);
}
但这并没有给出编译时警告,工具部分需要父webpart来实现IMyProperty接口。
简单的解决方案是在toolpart构造函数中添加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代码中存在令人讨厌的东西的感觉,这可能会让我后来惹恼我。