路由事件的TargetType

时间:2014-06-10 13:13:20

标签: c# wpf mvvm

我们有TargetType的样式,所以我们可以说请,只有按钮

<Style TargetType="Button">
    ...
</Style>

但是,举例说明这个片段:

<TabControl >
    <TabControl.Triggers>
        <EventTrigger RoutedEvent="TabControl.SelectionChanged">
            ...
        </EventTrigger>
    </TabControl.Triggers>
    <TabItem>
        <ListBox>
            <ListBoxItem>1</ListBoxItem>
            <ListBoxItem>2</ListBoxItem>
        </ListBox>
    </TabItem>
</TabControl>

TabControl (它甚至在xaml中指定,但不做任何事实){1}}事件发生时,我们有一些东西(例如,动画)附加到触发器。但是,当SelectionChanged所选项目也发生变化时,也会很快发生这种情况。

这是路由事件的本质,因为ListBox中没有处理程序,它将被路由到其父级。我们可以简单地使用

背后的代码
ListBox

并将其附加到每个孩子,如下所示:

private void Stop(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}

然而,想象有数百名儿童,在某些时候我们决定为他们的父母制作动画。现在我们必须经历所有孩子并将他们附加到血腥事件处理程序。正确?

不,这不对。应该有一些东西缺失。能够指定范围类型或任何内容(使事件触发器严格声明)。或者也许是一些肮脏的黑客。任何人都知道这样的事情吗?

P.S。:标记为MVVM,因为如果可以避免代码隐藏,代码隐藏就不那么好了。

1 个答案:

答案 0 :(得分:0)

我认为您的问题是由TabControlListBox覆盖Selector.SelectionChanged event引起的。但我同意你的意见,如果(我们已经)我们指定要使用重写的TabControl事件,则不应将其与Listbox.SelectionChanged事件混淆。甚至可以在Microsoft Connect网站上留下错误报告。

然而,有一个我能想到的修复,但它可能不适合你......这实际上取决于你在选择ListBox es时所做的事情。我们可以做的是为每个ListBox.SelectionChanged事件添加一个处理程序,并将SelectionChangedEventArgs.Handled属性设置为true,这样它就不会干扰SelectionChanged事件的TabControl事件。 <TabControl> <TabControl.Triggers> <EventTrigger RoutedEvent="TabControl.SelectionChanged"> <BeginStoryboard> <Storyboard> <DoubleAnimation From="0.25" To="1.0" Duration="0:0:1" Storyboard.TargetProperty="Opacity" /> </Storyboard> </BeginStoryboard> </EventTrigger> </TabControl.Triggers> <TabItem Header="Tab 1"> <ListBox SelectionChanged="ListBox_SelectionChanged"> <ListBoxItem>1</ListBoxItem> <ListBoxItem>2</ListBoxItem> </ListBox> </TabItem> <TabItem Header="Tab 2"> <ListBox SelectionChanged="ListBox_SelectionChanged"> <ListBoxItem>1</ListBoxItem> <ListBoxItem>2</ListBoxItem> </ListBox> </TabItem> </TabControl>

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}

...

ListBox

如果您想在SelectedItem上选择更改时执行某些操作,那么我建议您使用ListBox.SelectionChanged属性进行管理,然后您不会错过{{ 1}}事件。