2017-04-25 2 views
2

J'ai une fenêtre personnalisée qui a deux boutons. Un bouton est nommé OKButton et l'autre est appelé bouton Annuler.Comment rendre un élément d'un contrôle personnalisé accessible sur la vue pour l'enregistrer dans une commande?

<Style TargetType="{x:Type WindowCustom}"> 
    "Properties Here" 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type WindowCustom}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> 
            <Button x:Name="OKButton" Content="OK"/> 
            <Button x:Name="CancelButton" Content="Cancel"/> 
"Closing Tags" 

J'ai fait une partie de modèle avec des propriétés CLR pour le « OKButton » qui obtient instancié dans la méthode OnApplyTemplate. Supposons que tout le code nécessaire pour créer une fenêtre personnalisée existe. J'ai écrit plusieurs commandes routées pour que mon OKButton fasse ce que je veux. Ce n'est pas idéal parce que ma mise en œuvre précédente du bouton utilisé une (façon de dire Caliburns commande) ActionMessage

<Button> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <cal:ActionMessage MethodName="SaveHistoryEntry" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Button> 

Comment puis-je accéder à mon contrôle via XAML pour l'ajouter au message d'action? Ce que je peux faire est d'écrire le nom de mon contrôle de bouton sur la fenêtre personnalisée.

<lc:WindowCustom OKButton=""> 

Je ne sais pas quoi faire à partir d'ici.

Répondre

2

Vous pouvez ajouter une propriété de dépendance à votre WindowCustom classe:

public static readonly DependencyProperty OkCommandProperty = 
    DependencyProperty.Register("OkCommand", typeof(ICommand), 
    typeof(CustomWindow), new FrameworkPropertyMetadata(null)); 

public ICommand OkCommand 
{ 
    get { return (ICommand)GetValue(OkCommandProperty); } 
    set { SetValue(OkCommandProperty, value); } 
} 

... et lier la Command propriété du Button dans le ControlTemplate à celui-ci:

<Button x:Name="OKButton" Content="OK" Command="{Binding OkCommand, RelativeSource={RelativeSource TemplatedParent}}"/> 

Vous pouvez ensuite définir ou lier la propriété de dépendance de la fenêtre à une propriété source ICommand comme d'habitude:

<lc:WindowCustom OkCommand="{Binding YourViewModelCommandProperty}"> 

La commande sera invoquée lorsque l'utilisateur cliquera sur Button. Vous pouvez bien sûr faire la même chose pour l'annulation Button. Ajoutez simplement une autre propriété de dépendance.

+1

Je posterai bientôt mon implémentation avec caliburn. Merci mon pote! – axelrotter

2

Cette réponse s'adresse aux utilisateurs Caliburn Utilisateurs qui souhaitent utiliser la fonctionnalité ActionMessage sur leurs contrôles personnalisés. Le bouton qui se trouve sur ma fenêtre personnalisée ressemble à ce

<lc:ButtonCustom x:Name="PART_OKButton"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <cal:ActionMessage MethodName="{Binding OkCommand, RelativeSource={RelativeSource TemplatedParent}}" /> 
       </i:EventTrigger> 
       </i:Interaction.Triggers> 
</lc:ButtonCustom> 

Le code C# sur le CustomWindow est presque identique à la réponse de mm8. J'ai changé l'ICommand en un type de données String, puisque le message ActionMessage accepte une chaîne.

Enfin sur la fenêtre j'affecte l'action que je veux au message d'action.

<lc:WindowCustom <!--xmlns tags and other dependency proerties--> 
    OkCommand="SaveHistoryEntry"> 

Cela fonctionne!