La manipulation événement Click d'un Bouton dans le code XAML?
Cela se sent comme un terriblement question de base, mais je suis sûr qu'il ya une meilleure façon de le faire. J'ai un Button
dans mon INTERFACE utilisateur sélectionne un onglet spécifique et le feu Command
de la ViewModel
Voici le code actuel (qui fonctionne très bien):
XAML:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
Code derrière:
private void OnButtonClick(object sender, RoutedEventArgs e)
{
theTab.IsSelected = true;
}
N'est-ce pas là un nettoyant, XAML seule façon de le faire que de l'INTERFACE utilisateur de l'opération? Je pensais à quelque chose comme:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}">
<Button.Triggers>
<EventTrigger RoutedEvent="Click">
<Setter TargetName="theTab" Property="IsSelected" Value="True" />
</EventTrigger>
</Button.Trigger>
</Button>
Mais malheureusement, il semble que la EventTrigger
ne prend pas en charge un Click
événement. Pourquoi donc? Je suis encore parfois confondu avec les déclencheurs après quelques années de travail dans WPF, et ce joli beaucoup, il résume. En essayant de construire que j'ai une erreur sur la Setter
ligne:
A value of type 'Setter' cannot be added to a collection or dictionary of type 'TriggerActionCollection'.
Merci!
MODIFIER depuis que j'ai demander le code XAML de la structure de ma Fenêtre, il ressemble à ceci:
<DockPanel LastChildFill="True">
<Ribbon DockPanel.Dock="Top">
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
</Ribbon>
<TabControl>
<TabItem x:Name="theTab" />
</TabControl>
</DockPanel>
Je crois que ceci et/ou ceci peut-être une réponse pour vous... (Et également utiliser le Bouton.Cliquez sur la place de la souris)
Il n'est pas pertinent pour la question elle-même de l'omi. Avez-vous besoin?
oui. Je veux voir de la hiérarchie, où le bouton est et de l'onglet où est?
Je suis d'accord, il semble terriblement compliqué, mais c'est la façon dont il peut être fait 🙂 Vous pouvez créer un storyboard de ressources, et de l'utiliser dans le Déclencheur, il aura l'air un peu plus simple.
OriginalL'auteur Damascus | 2014-06-03
Vous devez vous connecter pour publier un commentaire.
Il ya certainement une meilleure façon. Avec l'aide de la
Windows.Interactivity
de l'assemblée, vous êtes en mesure de lier la source de l'événement à un seul de la classe, ne contenant que l'action associée. Avec cela, vous pouvez presque faire tout ce que vous nie.L'action de catégorie a à tirer de TriggerAction. En substituant les
Invoke
-méthode, vous pouvez spécifier l'action.Malgré ce scénario, il est également possible de lier la
EventTrigger
à une commande (par ex. relais de commande), permettant un nettoyage MMVM mise en œuvre.J'ai mis à jour le code pour répondre à vos exigences spécifiques. Le
TriggerAction
classe comprend aussi une propriété de dépendance, qui peut être cound à votre onglet de contrôle:Super 🙂 Merci de sujet que j'ai mis à jour le code de traiter également avec le TabControl.
OriginalL'auteur Dennis Kassel
Erreur, il résume. Vous ne pouvez pas utiliser
Setter
dansEventTrigger
. Si vous voulez le faire dans le code XAML, vous pouvez utiliserStoryboard
qui va sélectionner donné onglet lorsque le bouton est pressé. Quelque chose comme ceci:Storyboard
avec unAnimation
être plus simple et propre qu'un code-behindEventHandler
? Si c'est la seule façon de le faire, je pense que je vais probablement s'en tenir au code-behind. Je vais garder ouverte la question pour voir si quelque chose d'autre arrive avant l'acceptation de votre réponse 🙂 Merci à vous!Vous avez raison, dans ce cas, le code derrière est plus simple. Le problème est que normal
Trigger
a concept d'état afinSetter
peut être annulée, maisEventTrigger
n'a pas un tel concept, donc tout ce que vous pouvez faire est de commencer des actions quand il arrive.Oh, c'est pourquoi. Je suis toujours la confusion entre tous ces
Triggers
possibilité. pourquoi dans unStyle
être différent! Je vais essayer de travailler un plus court de solution. Peut-être en créer un autreStoryboard
classe dérivéeOriginalL'auteur dkozl
Vous pouvez introduire une
bool
propriétéIsMyTabSelected
à votre VM, le lier àTabItem.IsSelected
:Alors que vous venez de définir cet indicateur dans le
WhateverCommand
gestionnaire pour l'Button
.Remarque: Le
IsMyTabSelected
propriété doit mettre en œuvreSystem.ComponentModel.INotifyPropertyChanged
.IsMyTabSelected
pur propriété d'INTERFACE utilisateur dans mon ViewModel, car cela peut juste être commuté dans le code XAML derrière. Ce qui est amusant, c'est que pour un problème simple, chaque seule solution semble pas adapté :/Pas XAML seulement, mais aussi pas de code-behind et simple. En outre, il est difficile (impossible?) pour garder
ViewModel
pas de la "pure UI" dans ce grand projet.OriginalL'auteur amnezjak