Visual Studio (2015) XAML编辑器在自动完成ComboBox成员列表中提供了一个名为Selected
的事件。这个自动补全错误的原因是什么?
Selected
它不是WPF ComboBox事件(event list,而是ComboBoxItem
的事件)(继承自ListBoxItem.Selected。
为什么会这样呢?
编辑
作为@glenThomas的回答(感谢),选择了来自Selector
的附加事件,以便轻松收听所有子选择事件。
但是, in work...如果我在Selected
中放了一个处理程序,然后我构建了一个项目,我会收到一个错误:
'ComboBox‘不包含'Selected’的定义,并且找不到接受类型为'ComboBox‘的第一个参数的扩展方法'Selected’
发布于 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
类有一个用于所选事件的公共字段:
public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent(
"Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Selector));
但是您不能为事件添加处理程序,因为Selector
类不像下面这样定义事件:
public event RoutedEventHandler Selected
{
add
{
AddHandler(SelectedEvent, value);
}
remove
{
RemoveHandler(SelectedEvent, value);
}
}
因此,将其包含在ComboBox
的智能感知中是没有意义的。
但是,ComboBoxItem
的基类ListBoxItem
为您定义了附加处理程序的事件,因此您可以将处理程序附加到ComboBoxItems
发布于 2015-09-21 16:18:05
Selected
是在Selector
类中定义的附加事件,并且假定与选择器项一起使用。通常你会这样写:
<ListBoxItem Selector.Selected="OnSelected" />
如下所示,ComboBox也可以是一个条目,这就是在智能感知中列出Selected
事件的原因:
<ListBox x:Name="Selector">
<ComboBox x:Name="Item1" />
<ComboBox x:Name="Item2" />
</ListBox>
但是,combobox必须是另一个选择器的项,才能使用所选事件:
<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,而只需编写列:
<Grid>
<!-- Grid.Column="1" -->
<Grid Column="1" />
</Grid>
至少,这解释了visual studio中自动完成的行为。
编辑:既不是Selector.Selected也不是Selected="..“从Selector继承的控件中的语法无法编译,可能是由于XAML分析器中的错误。但是,使用命名xml名称空间也有变通方法:
<ListBox x:Name="Selector2"
xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
<ComboBox x:Name="Item1" p:Selector.Selected="Item1_Selected"/>
https://stackoverflow.com/questions/32488083
复制相似问题