【发布时间】:2010-07-09 11:01:29
【问题描述】:
现在我要学习 RoutedEvents。我了解冒泡和隧道效应等等。但是我有个小问题不知道怎么处理。
我在自己定义的 UserControl 中有一个 ItemsControl(继承 TabItem )。这个 itemsControl 可能是一个 ListBox 或一些尚未决定的选择器(取决于这个解决方案的最佳选择)。
现在当一个项目被选中时(还不确定最好的选择方法是什么,也许是双击)我需要在包含我的 UserControl 的 TabControl 中捕获事件。值得庆幸的是,当我的 userControl 被放入 XAML 可视化树时,冒泡事件向上流动,事件可以到达 TabControl。但是,我在实现这一点时仍然存在一些问题。
1) 假设我将其设置为 MouseDoubleClick 我不希望其他 DoubleClicks (例如在其他选项卡中或 ItemsControlItems 之外)。我想您总是可以检查事件的来源,以确保它是正确的,但我认为这不是正确的方式,它可能会自找麻烦。
2) 如果我将事件设置为 SelectionChanged 并将 ItemsControl 设置为 ListBox,我必须确保 ListBox 本身不会处理它,以便它可以到达 tabControl。我该怎么做?
3) 与 2) 相同,但 TabControl 本身就是一个选择器,所以它会引发它自己的 selectionchange 事件,不是吗。那将如何工作。处理程序会同时从列表框和 TabControl 中抓取吗?
4) 不确定我应该使用什么 ItemsControl。如果我只是用它来双击项目然后处理事件不会 ListBox 太多。它具有许多不受欢迎的效果,例如选择等。是定义自己的 ItemsControl 更好,还是使用 ListBox 并覆盖它的一些属性,如选择(如何做到这一点?)?
5) 事件的来源是 ItemsContainer,但我不是项目本身。有一种简单的方法可以访问它不是吗?
6) 假设我放置了一个按钮,并且在 DataTemplate 中我不想通过按钮附加对象的 ID 并在处理按钮单击的位置捕获它以识别它是什么项目。是否有一个属性可以做到这一点,还是我必须自己定义它?
7) 最好的做法是创建我自己的活动吗?
您对这个问题的看法和 cmets 关于在这里最好采取什么流程的看法。
编辑:决定按要求添加更多信息。
我的目标是什么;当我启动程序时,我有一个 TabControl,里面有 1 个选项卡。此选项卡与其他选项卡的不同之处在于它包含一个对象列表(CompanyModel)。这个列表就是我提到的 ItemsControl。当您按此列表中的一家公司时,会添加一个包含该公司信息的新选项卡。
我的解决方案是创建一个 TabItem 集合作为 TabControl 的源。然后我会在一个单独的 XAML 源文件中定义我的 2 种类型的 TabItems(不知道该怎么称呼它,基本上是添加新的用户控件)。一个是列表出现的初始位置,另一个接受 CompanyModel 作为构造函数参数并显示相关信息。
虽然我不喜欢单独定义公司列表 tabitem 的想法,但我无法在 tabcontrol 下定义它,因为我只能定义项目或来源,而不是两者。
我已经尝试了这个想法,方法是在 List DataTemplate 上放置一个按钮,该按钮将所选公司的 Id 冒泡到 TabControl,在那里处理它并使用 CompanyModel 添加一个新的 TabItem。这只是一个尝试的解决方案,并且存在一些问题,比如如果我将另一个按钮添加到 CompanyTabs,我也会在 TabControl 中抓取它们。
所以我的问题可以通过找到一种从原始 listTab 中冒泡事件的好方法来解决,或者如果我能够在与 TabControl 相同的位置定义选项卡。
我知道另一种解决方案是将列表与 TabControl 分开,但其他人想看看结果如何,我想了解我将如何做到这一点。
【问题讨论】:
-
2) 为什么要在 TabControl 中处理它? 5)
The source of the event would be the ItemsContainer but I wan't the item itself这是什么意思? ... 需要更多关于您想要实现的目标的详细信息。 -
我在运行时动态地将 TabItems 放入集合中,并且该集合是 TabControl 的项目源。所以我定义了我自己的 TabItem,它将我显示的对象作为构造函数参数。因此,当我按下列表上的项目时,它需要使用该项目作为构造函数参数创建新的 TabItem 并将其添加到 TabItem 列表中。我无法从选项卡本身访问此列表,因此我必须将其向上冒泡到 TabControl。好吧,另一件事不是那么重要,大概是我自己能找到的东西。我不想访问 CompanyModel 而不是 ListBoxItem
标签: wpf event-bubbling routedevents