Joindre ICommand dans WPF UserControl
J'ai mis en place un simple bouton avec une image:
<Button Command="{Binding ButtonCommand, ElementName=ImageButtonControl}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ButtonImage, ElementName=ImageButtonControl}"/>
<TextBlock Text="{Binding ButtonText, ElementName=ImageButtonControl}" Margin="2,0,0,0"/>
</StackPanel>
</Button>
Comme vous pouvez le voir, j'expose un ButtonCommand propriété afin d'être en mesure de joindre un ICommand à ce UserControl:
public partial class ImageButton : UserControl
{
///<summary>
///The dependency property that gets or sets the source of the image to render.
///</summary>
public static DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ButtonImage", typeof(ImageSource), typeof(ImageButton));
public static DependencyProperty TextProperty =
DependencyProperty.Register("ButtonText", typeof(string), typeof(ImageButton));
public static DependencyProperty ButtonCommandProperty =
DependencyProperty.Register("ButtonCommand", typeof(ICommand), typeof(ImageButton));
public ImageButton()
{
this.DataContext = this;
InitializeComponent();
}
///<summary>
///Gets or sets the button command.
///</summary>
public ICommand ButtonCommand
{
get { return (ICommand)GetValue(ImageButton.ButtonCommandProperty); }
set { SetValue(ImageButton.ButtonCommandProperty, value); }
}
///<summary>
///Gets or sets the button image.
///</summary>
public ImageSource ButtonImage
{
get { return (ImageSource)GetValue(ImageButton.ImageSourceProperty); }
set { SetValue(ImageButton.ImageSourceProperty, value); }
}
///<summary>
///Gets or sets the button text.
///</summary>
public string ButtonText
{
get { return (string)GetValue(ImageButton.TextProperty); }
set { SetValue(ImageButton.TextProperty, value); }
}
}
Puis quand je déclare mon bouton ça donne ça:
<uc:ImageButton Grid.Row="1" Grid.Column="0" ButtonCommand="{Binding AttachContextCommand}" ButtonImage="{StaticResource AssociateImage}" ButtonText="Associer"/>
Et badaboom, rien n'arrive jamais quand je clique sur mon ImageButton.
Lorsque je remplace le ImageButton avec un simple bouton, la ICommand est appelé.
J'ai même essayé de simplement s'étend la classe de Bouton et le lier à une ICommand, mais encore une fois, cela n'a pas fonctionné...
Aide appréciée !
Thx.
Je clique dessus et la commande n'est jamais appelé...
OriginalL'auteur Roubachof | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez atteindre cet objectif dans un beaucoup plus propre chemin à l'aide d'un style et d'un couple de propriétés attachées.
Les propriétés attachées permettra de stocker vos informations spécifiques.
Le style de l'utilisation de ces propriétés et de construire le look que vous voulez.
L'élément sera toujours un bouton pour la commande et tout le reste fonctionne.
Vous pouvez ensuite l'utiliser pour déclarer les boutons:
Remarque:
Je suis sûr que ce serait plus propre de passer par le "Modèle" de la propriété et de l'utilisation d'un ControlTemplate et TemplateBindings, mais cela signifierait re-création de la frontière et d'autres choses autour de votre contenu, donc si vous êtes à la recherche d'suffit de définir une valeur par défaut de "Contenu", mon exemple serait la voie à suivre, je pense.
En effet, ils sont. Le fait que vous pouvez joindre comportement d'éléments par le biais de propriétés attachées (comme déclarative de la manipulation d'événements pour des choses comme le Glisser-Déposer) est encore plus impressionnant lorsque vous l'obtenir.
+1 Très simple, flexible et réutilisable. Merci
J'ai une question cependant: Est-il reasone à utiliser DynamicResource? Ne serait pas StaticResource être suffisant?
Cela a fonctionné pour moi après que j'ai fait une légère modification du style de balisage. J'ai dû enlever le "Path=" de l'Image et TextBlock Contraignant en raison d'une voie d'exception. Maintenant, mon élément de l'Image ressemble:
<Image Source="{Binding (local:ImageButton.Image), RelativeSource={RelativeSource AncestorType={x:Type Button}}}" />
Espère que cela aide.OriginalL'auteur Denis Troller
Si le seul ajout de la fonctionnalité que vous souhaitez pour votre bouton est d'avoir une image sur elle, alors je pense que vous vous approchez de ce de la mauvaise direction. WPF est aussi génial que c'est parce que les contrôles de l'INTERFACE utilisateur sont look. Cela signifie qu'un Contrôle est simplement une définition de la fonctionnalité + quelques modèles de définir à quoi il ressemble. Cela signifie que le modèle peut être échangé à tout moment, pour changer de look. Aussi, presque tout le contenu peut être placé à l'intérieur de presque n'importe quel contrôle
Par exemple, pour définir un bouton dans votre xaml qui a le look de votre va pour tous vous avez besoin est: est-ce
Il suffit de garder à l'esprit que, avec WPF vous n'avez pas à définir une nouvelle CustomControl ou UserControl à chaque fois que vous voulez changer le look et la sensation de quelque chose. La seule fois où vous avez besoin d'un CustomControl est, si vous voulez ajouter des fonctionnalités à un Contrôle existant ou pour créer une fonctionnalité qui n'existe pas dans n'importe quel autre Contrôle.
Modifier en Raison de commentaire:
Si vous êtes désireux de le garder à partir de la définition du contenu pour le bouton à chaque fois, l'autre option est d'avoir juste un poco (plain old CLR objet) de la classe qui permettrait de définir tout ce que vous intéresse (je vais écrire mon exemple si vous faites cela pour une barre d'outil, parce qu'il fait sens pour moi):
Qui a un modèle de données défini quelque part (App.xaml, Fenêtre.Ressources, etc):
Et ensuite utiliser le gars dans votre xaml comme ceci:
Je ne sais pas que la façon dont vous essayez de faire, c'est le plus WPF est possible de le faire.
ÉDITION mise à Jour basé sur second commentaire
Désolé, j'ai oublié d'inclure le ContentControl environnante. Maintenant que je me rappelle, je me rends compte que ce n'est pas beaucoup moins verbeux que l'original où vous êtes en précisant le contenu manuellement. Je vais poster une nouvelle réponse pour les aider avec votre question initiale.
Désolé, mais ce n'est pas de travail... ToolBarItem n'est pas un UIElement et lorsque j'essaie de lancer l'application, j'obtiens une exception qui me dit que si.
OriginalL'auteur dustyburwell
Pour re-répondre à la question initiale:
Ce que je pense que vous voulez faire est de créer un nouveau CustomControl appelé ImageButton. Puis changer pour s'étendre de Bouton plutôt que de Contrôle. Vous n'aurez pas besoin d'une Commande de la propriété depuis le Bouton en possède déjà un. Vous aurez seulement besoin d'ajouter une Image à la propriété et vous pouvez réutiliser le Contenu de la propriété de la touche au lieu d'avoir une propriété de Texte.
Lorsque votre CustomControl est créé, il va ajouter une entrée dans le Générique.xaml pour le style par défaut de votre ImageButton. Dans le Setter de la propriété de Modèle, vous pouvez modifier la ControlTemplate:
Puis, à nouveau, quand vous voulez l'utiliser:
OriginalL'auteur dustyburwell
Intégré dans WPF bouton contient le code qui déclenche l'attaché de commande en réponse à cliqué. Votre "ImageButton" dérive de UserControl, si vous n'obtenez pas ce comportement. Probablement la route la plus courte pour obtenir ce que vous voulez pour votre ImageButton classe pour réellement tirer de la WPF Bouton de classe. Pour cela, modifier le balisage de ImageButton de
à
Puis modifier la classe de base de ImageButton de
UserControl
àButton
.Vous aurez probablement besoin de faire quelques autres modifications mineures avant tout cela fonctionne.
OriginalL'auteur Daniel Pratt