Dans WPF, comment faire pour ajouter un Gestionnaire d'événements pour un FrameworkElement conçu dans le Modèle?
J'ai défini le suivant DataTemplate
pour ListBox
éléments dans un dictionnaire de ressources externes:
<DataTemplate x:Key="MyListBoxItemTemplate" DataType="{x:Type entities:Track}">
<StackPanel>
<TextBlock Text="Here's the slider:" />
<Slider Name="MySlider" Height="23" Minimum="0" />
</StackPanel>
</DataTemplate>
J'ai besoin de fournir une méthode de gestionnaire d'événement pour le Curseur de la ValueChanged
événement. Je ne sais pas où je suis censé écrire le code comme il est impossible de spécifier gestionnaire d'événement pour un contrôle à l'intérieur d'un modèle.
J'ai cherché sur google pour trouvé la solution et que je devrais ajouter le gestionnaire d'événement dans la substitution de la OnApplyTemplate()
méthode. Je pense qu'il devrait ressembler à quelque chose comme ceci ou similaires:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
//Is the following initialization even going to work!?!?
Slider MySlider = this.FindName("MySlider") as Slider;
SeekSlider.ValueChanged +=
new RoutedPropertyChangedEventHandler<double>(SeekSlider_ValueChanged);
}
Mais où dois-je écrire cette méthode? Ne OnApplyTemplate prépondérant ne s'applique qu'à ControlTemplates ou est mon scénario inclus ainsi? Dois-je fournir ControlTemplate au lieu de DataTemplate? Est le corps de la méthode que j'ai fournie est correcte?
S'il vous plaît aider. Merci.
OriginalL'auteur Boris | 2011-02-24
Vous devez vous connecter pour publier un commentaire.
À l'aide de la
OnApplyTemplate
approche ne fonctionnera que si vous si vous travaillez avec lesControlTemplate
pour un Contrôle. Par exemple, si vous avez sous-classéTextBox
vous pouvez faire cela commeJe ne pense pas que cette approche fonctionne dans votre situation. Vous pouvez utiliser l'événement Chargé de
ListBoxItem
et de trouver laSlider
dans l'arborescence visuelle dans le gestionnaire d'événementsCode derrière
GetVisualChild
OriginalL'auteur Fredrik Hedblad
Peu de savoir fait est que ResourceDictionaries peut contenir le Code-behind ainsi..
Comme une règle générale je ne pense pas que de mettre les DataTemplates dans ResourceDictionaries est une bonne idée de commencer avec (votre question en étant un exemple pour l'une des raisons), c'est comment vous pouvez résoudre:
XAML:
et le code behind:
De toute façon, comme Meleak dit au-dessus de moi - OnApplyTemplate n'est pertinente que pour les Modèles de Contrôle et non pas des Modèles de Données.
ControlTemplate
🙂J'ai pensé un peu à ce sujet et je n'aime pas ça. Un ValueChanged méthode sur un ResourceDictionary est de sortir de la place. Il est bon de savoir qu'il y a un code-behind pour les dictionnaires de ressources, mais cela sent.
Je suis très d'accord.. je suis même en prenant un pas en avant pour dire que l'Omi datatemplates au total n'ont pas leur place dans les dictionnaires de ressources
OriginalL'auteur Elad Katz
Jetez un oeil à cette question et la réponse.
Je pense que à l'aide de Commandes est la meilleure option.
MODIFIER Un bon tutoriel
J'ai ajouté un bon tutoriel qui explique et montre les commandes standard et les commandes personnalisées.
Grâce Erno, j'ai écrémé (que je suis bien trop occupée en ce moment) et il apparaît logique. Merci à vous pour m'aider à comprendre le concept de commandes en WPF.
OriginalL'auteur Erno de Weerd
Vous pouvez utiliser
EventSetter
dans le style, vous êtes en définissant le modèle avec:OriginalL'auteur ezolotko
Méthode 1:
Utilisez votre propre, héritée de
Slider
:Méthode 2: utilisez des comportements de System.Windows.Interactivity.dll de l'assemblée (disponible par le biais de la NuGet):
C'est la façon de le joindre:
OriginalL'auteur Lu55