【问题标题】:Passing an object to a collection editor将对象传递给集合编辑器
【发布时间】:2014-11-04 06:46:35
【问题描述】:

我正在尝试为ToolStripMenuItem 构建一个检查列表,该列表自动处理项目的检查和取消检查,然后我向程序员提供一个事件,允许他们处理接下来发生的事情。如果这样的东西已经存在,我很想知道它在哪里。我已经为我的自定义 ToolStripMenuItem 创建了集合编辑器,我可以将检查列表添加到这个清单集合中。我的问题是你像这样创建集合编辑器:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
 Editor(typeof(ToolStripItemExtCollectionEditor), typeof(UITypeEditor))]

我需要能够将此ToolStripMenuItemDropDownitems 传递给此集合编辑器,这样当您添加新清单并单击清单的项目属性时,您可以添加/删除任何一个已知的 ToolStripMenuItems到/从清单。传递引用是行不通的,因为所有这些都发生在属性内部,如果答案是反射,我不知道从哪里开始。

【问题讨论】:

  • 从哪里开始:在 ToolStripItemExtCollectionEditor 类中设置一些断点,然后检查那里的值。
  • 到目前为止,我发现选择组件会启动对集合编辑器的构造函数的调用,并在打开集合时调用 CreateNewItemTypes()。有没有办法调试我的设计器?如果我能做到,我也许可以看到谁在调用属性构造函数。
  • 也许您可以启动第二个 VS 实例,并将调试器连接到它。我知道这适用于 Expression Blend。
  • 不幸的是,我碰到了 VB Express 的能力墙。 DX 我确实找到了这个link。我的作品阻止了论坛帖子中的链接,所以我不知道这种解决方法是否有效。我确实有 SharpDevelop,你可以用它“附加到处理”。我不知道如何调试它的另一个实例。

标签: c# winforms windows-forms-designer collectioneditor design-time-data


【解决方案1】:

这个答案适用于 VB.NET。我打算把它变成 C# 的 DLL,但现在它在 vb.net 中,因为这是我开始这个想法的地方,也是项目所在的语言。

这是我目前所拥有的:

ToolStripMenuItemExt

目的:我的自定义ToolStripMenuItem

ToolStripMenuItemExt 有一个CheckListSheet,其中包含对ToolStripMenuItemExt 的 DropDownItems 的引用(我通过引用而不是 byval 传入 dropdownitems)。它有一个属性返回CheckListSheet 中的CheckLists 对象。

CheckListSheet

目的:通过可观察的集合类型和我在ToolStripMenuItemExt中返回的集合的对象维护对我正在观察的集合的引用。

CheckListSheet 具有 CheckLists 对象。我传入 byref 的下拉项存储在 ObservableToolStripItemCollection 中,希望当我开始测试它时,我可以更轻松地更新清单集合,因为它继承了 ObservableCollection(of ToolStripItemCollection)。该类还有一个共享函数,该函数返回具有私有共享范围标识符的可观察集合。

检查清单

用途:存储CheckList 对象的CollectionBase 类型。

清单

目的:存储ToolStripItemCollection,其对象充当单项检查清单(一次只检查一项)。

这具有设计器的一些属性和检查列表的集合。最终,我将添加逻辑以检查并自动取消选中并为其引发事件。

MenuItemCheckListCollectionEditor

目的:允许显示已知和实例化 ToolStripItem 对象的集合并将其添加到CheckList

现在它要求我给它一个类型或类型数组,以便它可以确定它自己是什么类型的CollectionEditor。我无法显示类型的下拉列表或ToolStripItem 对象的下拉列表。任何名称中包含 ToolStrip 的类都会继承 ToolStripItem,这就是我使用这种类型对象的原因。

如果任何人对我当前的答案有任何建议或可以预测任何可预见的陷阱,请分享。我不在乎你是用 c# 还是 vb.net 说话。也许我只需要停下来把它变成 c# 代码。也许这是不可能的。不过我正在取得进展。弄清楚 MenuStrip 的集合编辑器如何填充 ToolStripItems 的下拉列表会非常有帮助

[更新]

一个集合编辑器需要你提供一个类型来显示它。这种类型必须继承CollectionBase,这意味着在设计时它无法引用下拉项。 :sigh:

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2021-02-11
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多