首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WPF ComboBox.Selected附加事件。存在还是不存在?

WPF ComboBox.Selected附加事件。存在还是不存在?
EN

Stack Overflow用户
提问于 2015-09-10 03:55:10
回答 2查看 3K关注 0票数 20

Visual Studio (2015) XAML编辑器在自动完成ComboBox成员列表中提供了一个名为Selected的事件。这个自动补全错误的原因是什么?

Selected它不是WPF ComboBox事件(event list,而是ComboBoxItem的事件)(继承自ListBoxItem.Selected

为什么会这样呢?

编辑

作为@glenThomas的回答(感谢),选择了来自Selector的附加事件,以便轻松收听所有子选择事件。

但是, in work...如果我在Selected中放了一个处理程序,然后我构建了一个项目,我会收到一个错误:

'ComboBox‘不包含'Selected’的定义,并且找不到接受类型为'ComboBox‘的第一个参数的扩展方法'Selected’

EN

回答 2

Stack Overflow用户

发布于 2015-09-10 06:23:03

System.Windows.Controls.ComboBox继承自具有Selected附加事件的System.Windows.Controls.Primitives.Selector

附加事件允许您将特定事件的处理程序附加到某个子元素,而不是实际定义该事件的父元素,即使潜在引发该事件的对象和目标处理实例都没有在其命名空间中定义或以其他方式“拥有”该事件。

System.Windows.Controls.Primitives.Selector有一个SelectedEvent字段,它支持Selected附加事件。

Selected事件的原因是,您可以向控件添加一个事件处理程序,当许多子控件中的任何一个引发该事件时,都将执行该事件处理程序。这比将事件处理程序附加到每个ComboBoxItem要方便得多。

至于为什么它包含在XAML代码编辑器的intellisense中,我相信这是一个bug。Selector类有一个用于所选事件的公共字段:

代码语言:javascript
复制
public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent( 
            "Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Selector));

但是您不能为事件添加处理程序,因为Selector类不像下面这样定义事件:

代码语言:javascript
复制
public event RoutedEventHandler Selected
{ 
    add 
    {
        AddHandler(SelectedEvent, value); 
    }
    remove
    {
        RemoveHandler(SelectedEvent, value); 
    }
}

因此,将其包含在ComboBox的智能感知中是没有意义的。

但是,ComboBoxItem的基类ListBoxItem为您定义了附加处理程序的事件,因此您可以将处理程序附加到ComboBoxItems

票数 8
EN

Stack Overflow用户

发布于 2015-09-21 16:18:05

Selected是在Selector类中定义的附加事件,并且假定与选择器项一起使用。通常你会这样写:

代码语言:javascript
复制
<ListBoxItem Selector.Selected="OnSelected" />

如下所示,ComboBox也可以是一个条目,这就是在智能感知中列出Selected事件的原因:

代码语言:javascript
复制
<ListBox x:Name="Selector">
    <ComboBox x:Name="Item1" />
    <ComboBox x:Name="Item2" />
</ListBox>

但是,combobox必须是另一个选择器的项,才能使用所选事件:

代码语言:javascript
复制
<ComboBox x:Name="Selector1" Selector.Selected="ThisDoesNotWork"/>
<ListBox x:Name="Selector2">
    <ComboBox x:Name="Item1" Selector.Selected="ThisShouldWorkButDoesnt"/>
     <!-- See edit -->
    <ComboBox x:Name="Item2" />
</ListBox>

原因是,为什么您不必编写Selector.Selected="..“但只有Selected="..."?因为Combobox也是选择器。类似地,在附加到网格时,您不必编写Grid.Column,而只需编写列:

代码语言:javascript
复制
<Grid>
    <!-- Grid.Column="1" -->
    <Grid Column="1" />
</Grid>

至少,这解释了visual studio中自动完成的行为。

编辑:既不是Selector.Selected也不是Selected="..“从Selector继承的控件中的语法无法编译,可能是由于XAML分析器中的错误。但是,使用命名xml名称空间也有变通方法:

代码语言:javascript
复制
<ListBox x:Name="Selector2"
         xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
    <ComboBox x:Name="Item1" p:Selector.Selected="Item1_Selected"/>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32488083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档