C# 路由事件的TargetType

C# 路由事件的TargetType,c#,wpf,mvvm,C#,Wpf,Mvvm,对于样式,我们有TargetType,因此我们可以说请,只有按钮: 并将其附加到每个孩子上,如下所示: <ListBox SelectionChanged="Stop"> ... </ListBox> ... 然而,想象一下有数百个孩子,在某个时候我们决定给他们的父母制作动画。现在我们必须遍历所有子项并将它们附加到血腥事件处理程序。对吧? 不,不对。应该少了些什么。指定范围、类型或任何内容的能力(使事件触发器对声明严格)。或者是一些肮脏的黑客。有人知道这样的事

对于样式,我们有
TargetType
,因此我们可以说请,只有按钮:

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

 <ListBox SelectionChanged="Stop">
 ...
 </ListBox>

...
然而,想象一下有数百个孩子,在某个时候我们决定给他们的父母制作动画。现在我们必须遍历所有子项并将它们附加到血腥事件处理程序。对吧?

不,不对。应该少了些什么。指定范围、类型或任何内容的能力(使事件触发器对声明严格)。或者是一些肮脏的黑客。有人知道这样的事吗


备注:标记为MVVM,因为如果可以避免,代码隐藏就没有那么好。

我认为您的问题是由
TabControl
ListBox
覆盖了。但是,我同意您的意见,如果(正如我们所做的)我们指定要使用重写的
TabControl
事件,则不应将其与
Listbox.SelectionChanged
事件混淆。甚至在网站上留下bug报告也可能是个好主意

然而,我可以想到一个解决方案,但它可能不适合您。。。这实际上取决于当
列表框的选择发生变化时您正在做什么。我们可以做的是为每个
列表框.SelectionChanged
事件添加一个处理程序,并将
SelectionChangedEventArgs.Handled
属性设置为
true
,这样它就不会干扰
选项卡控件的
SelectionChanged
事件:

<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>

如果您想在
ListBox
上的选择更改时执行某些操作,那么我建议您使用
SelectedItem
属性来管理它,这样您就不会错过
ListBox.SelectionChanged
事件。

我不确定是否理解。。。你在为每一位家长制作动画?您想要实现什么?我们为
样式
提供了
TargetType
,因此我们可以说“请”,只有按钮。。。这是不正确的。我们告诉框架,
样式
的类型为
按钮
,这样它就可以知道需要哪些属性,以及是否向我们发出错误警报。+1用于查找有趣的问题。
private void Stop(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}
 <ListBox SelectionChanged="Stop">
 ...
 </ListBox>
<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;
}