1

现在我要学习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) 这里最好的做法是创建我自己的活动吗?

您对这个问题的看法以及对这里最好采用哪种流程的评论是值得赞赏的。

编辑:决定按要求添加更多信息。

我的目标是什么;当我启动程序时,我有一个 TabControl,里面有 1 个选项卡。此选项卡与其他选项卡的不同之处在于它包含一个对象列表(CompanyModel)。这个列表就是我提到的 ItemsControl。当您按此列表中的一家公司时,会添加一个包含该公司信息的新选项卡。

我的解决方案是创建一个 TabItem 集合作为 TabControl 的源。然后我会在一个单独的 XAML 源文件中定义我的 2 种类型的 TabItems(不知道该怎么称呼它,基本上是添加新的用户控件)。一个是列表出现的初始位置,另一个接受 CompanyModel 作为构造函数参数并显示有关该信息的信息。

虽然我不喜欢单独定义公司列表 tabitem 的想法,但我无法在 tabcontrol 下定义它,因为我只能定义项目或来源,而不是两者。

我已经通过在 List DataTemplate 上放置一个按钮来尝试这个想法,该按钮将所选公司的 Id 冒泡到 TabControl,在那里处理它并使用 CompanyModel 添加一个新的 TabItem。这只是一个尝试它的解决方案,并且存在问题,例如如果我向 CompanyTabs 添加 anpther 按钮,我也会在 TabControl 中抓住它们。

因此,我的问题可以通过找到一种从原始 listTab 中冒泡事件的好方法来解决,或者如果我能够在与 TabControl 相同的位置定义选项卡。

我知道另一种解决方案是将列表与 TabControl 分开,但其他人想看看这是如何产生的,我想了解我将如何做到这一点。

4

1 回答 1

0

请看一下这个博客,可能对你有帮助。 http://blogs.u2u.be/diederik/post/2009/09/09/In-WPF-SelectionChanged-does-not-mean-that-the-selection-changed.aspx

于 2011-11-19T09:34:30.517 回答