2015-09-09 17 views
19

Visual Studio (2015) L'editor XAML fornisce nell'elenco dei membri di ComboBox completamento automatico, un evento denominato Selected. Qual è la spiegazione di questo auto-completamento errato? auto complete ComboBox WPF. Evento associato selezionato. esiste o no?

Selected suo evento NON WPF ComboBox (event list), ma la sua un evento di ComboBoxItem (ereditato da ListBoxItem.Selected).

perché è?

EDIT

come @ glenThomas'answer (grazie), il selezionato il suo evento associato inhrited da Selector, per un facile ascolto per tutti gli eventi secondario selezionato.

Ma, la sua non funziona ... se metto un gestore in Selected e costruisco il progetto ricevo un errore:

'ComboBox' does not contain a definition for 'Selected' and no extension method 'Selected' accepting a first argument of type 'ComboBox' could be found

risposta

7

System.Windows.Controls.ComboBox eredita da System.Windows.Controls.Primitives.Selector, che ha un evento associato Selected.

Un evento collegato consente di associare un gestore per un evento particolare a un elemento figlio anziché al padre che definisce effettivamente l'evento, anche se né l'oggetto che potenzialmente genera l'evento né l'istanza di gestione destinazione definiscono o altrimenti " possedere "quell'evento nel loro spazio dei nomi.

System.Windows.Controls.Primitives.Selector ha un campo SelectedEvent, che supporta l'evento allegato Selected.

Il motivo dell'evento Selected è tale che è possibile aggiungere un gestore di eventi a un controllo che verrà eseguito quando uno dei numerosi controlli figlio rilancia l'evento. È molto più conveniente di collegare i gestori di eventi a ciascuno degli ComboBoxItem.

Per quanto riguarda il motivo per cui è incluso nell'intelligence dell'editor del codice XAML; Credo che sia un bug. La classe Selector ha un campo pubblico per l'evento selezionato:

public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent( 
      "Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Selector)); 

Ma non si può aggiungere un gestore per l'evento perché la classe Selector non definisce l'evento come questo:

public event RoutedEventHandler Selected 
{ 
    add 
    { 
     AddHandler(SelectedEvent, value); 
    } 
    remove 
    { 
     RemoveHandler(SelectedEvent, value); 
    } 
} 

Quindi non ha senso che sia incluso nell'intelligence per ComboBox.

Ma, ListBoxItem, che è la classe base per ComboBoxItem non definisce l'evento per voi di collegare i gestori, in modo da poter collegare i gestori alle ComboBoxItems

+0

grazie. ma come dici tu, questo evento ha significato solo su ListBoxItem e sui suoi eredi. In tal caso, per ciò che definisce evento ** allegato **, si tratta del normale comportamento dell'evento standard. – dovid

+0

Non ti capisco –

1

Selected è attaccato evento definito in Selector classe e si suppone a essere utilizzato con i selettori.Di solito si può scrivere:

<ListBoxItem Selector.Selected="OnSelected" /> 

Come mostrato di seguito, ComboBox può essere anche un elemento, è per questo che c'è l'evento Selected elencati in intellisense:

<ListBox x:Name="Selector"> 
    <ComboBox x:Name="Item1" /> 
    <ComboBox x:Name="Item2" /> 
</ListBox> 

Tuttavia, combobox deve essere un elemento di un altro selettore al fine di utilizzare l'evento Selected:

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

e la ragione, perché non dovete scrivere Selector.Selected = "..", ma appena selezionata = "..."? Perché Combobox è anche un selettore. Analogamente, non dovete scrivere Grid.Column ma solo Colonna, quando si collega alla griglia:

<Grid> 
    <!-- Grid.Column="1" --> 
    <Grid Column="1" /> 
</Grid> 

Almeno, questo questo comportamento spiegare di completamento automatico in Visual Studio.

EDIT: né Selector.Selected né Selected = ".." sintassi nei controlli ereditati dal selettore non compilato, probabilmente a causa di bug nel parser XAML. Ma c'è una soluzione alternativa che utilizza lo spazio dei nomi xml denominato:

<ListBox x:Name="Selector2" 
     xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"> 
    <ComboBox x:Name="Item1" p:Selector.Selected="Item1_Selected"/> 
+0

Hai provato quello che scrivi? Che per me c'è un errore quando una Combo è anche una voce di elenco. – dovid

+0

Beh, l'ho provato con altri controlli oltre a ListBoxItem, ma non con ComboBox. Sembra un bug nel parser. Vedi la mia modifica – Liero

+0

@Lireo La tua modifica è corretta. Ma l'evento non ha alcun effetto e non trotterrà mai, tranne quando è in ListBoxItem. Bene, perché questo evento _attached_? – dovid