2010-07-09 35 views
1

现在我即将学习RoutedEvents。我理解冒泡和隧道等等。但我有一个问题,我不知道如何处理。WPF:只处理来自一个特定内容的冒泡事件

我有一个ItemsControl在我自己定义的UserControl(继承TabItem)。这itemsControl可能是一个列表框或一些选择尚未决定(取决于什么是最好的解决方案)。

现在,当一个项目被选中(不知道什么是最好的选择方法,也许doubleclick)我需要捕获事件在持有我的UserControl的TabControl。值得庆幸的是,当我的用户控件被放入XAML可视树中时,冒泡事件流向上并且事件可以到达TabControl。然而,我仍然有一些实施这个问题。

1)假设我将它设置为MouseDoubleClick我不希望其他DoubleClicks(如在其他选项卡或ItemsControlItems之外)。我想你总是可以检查事件来自哪里,以确保它是正确的,但我不认为这是正确的方式,并且可能会造成麻烦。 2)如果我将事件设置为SelectionChanged并将ItemsControl设置为ListBox,我将不得不确保ListBox本身不处理它,以便它可以到达tabControl。我会怎么做?

3)与2)相同,但TabControl是一个选择器本身,所以它会引发它自己的selectionchange事件不是它。这将如何工作。处理程序是否会从列表框和TabControl中获取?

4)不确定我应该使用什么ItemsControl。如果我只用它来双击项目,然后处理事件不会ListBox太多。它具有许多不可调整的效果,如选择等。定义自己的ItemsControl还是使用ListBox并覆盖它的一些属性(如何做到这一点?)会更好吗?

5)事件的来源将是ItemsContainer,但我不希望项目本身。有一种简单的方法可以访问它不在吗?假设我在DataTemplate中放置了一个按钮,我不想通过按钮添加对象的ID,并在处理按钮点击的位置捕获它,以确定它是什么项目。有没有财产这样做,还是我必须自己定义它?

7)这里最好的行动方式是否可以创建我自己的活动?

你对这个问题有所了解,并评论什么过程最适合在这里进行评估。

编辑:决定添加一点点更多的信息,问。

我的目标是什么;当我启动程序时,我有一个带有1个选项卡的TabControl。此选项卡与选项卡的其余部分不同,因为它包含对象列表(CompanyModel)。这个列表是我提到的ItemsControl。当您从此列表中按一个公司时,会添加一个新选项卡,其中包含有关该公司的信息。

我的解决方案是创建一个TabItem集合作为TabControl的源代码。然后,我将在一个单独的XAML源文件中定义我的两种TabItems(不确定要调用它,基本上添加新的用户控件)。一个是列表出现的最初位置,另一个是将CompanyModel作为构造函数参数并显示有关信息。

这个工作,虽然我不喜欢定义公司名单tabitem seperatly的想法,我不能在tabcontrol下定义它,因为我只能有定义的项目或来源,而不是两个。

我试过这个想法,通过在List DataTemplate上放置一个按钮,将选中的公司的Id号码选中到TabControl,并在那里处理它,并添加一个新的与公司模型的TabItem。这只是一个解决方案,尝试它,并有问题,如果我将公钥按钮添加到CompanyTabs我会抓住他们以及在TabControl。

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

我知道另一个解决方案将从TabControl中分离出列表,但其他解决方案希望看到这是如何出现的,我想了解如何执行此操作。

+0

2)为什么你想要在TabControl中处理它? 5)'事件的来源将是ItemsContainer,但我不想要项目本身,这是什么意思? ...需要更多关于你想要实现的细节。 – Amsakanna 2010-07-09 11:43:44

+0

我在运行时动态地将TabItems投入到集合中,并且该集合是TabControl的itemssource。所以我已经定义了我自己的TabItem,它将一个对象显示为一个构造参数。所以当我按下列表中的项目时,需要用该项目作为构造函数参数创建新的TabItem,并将其添加到TabItem列表中。我没有从标签本身访问这个列表,所以我必须向上朝TabControl泡泡。 那么另一件事情就不那么重要了,我可以找出自己的东西。我不想访问CompanyModel而不是ListBoxItem – 2010-07-09 12:39:50

回答