2010-05-20 21 views
3

Je suis relativement nouveau à WPF et parfois ça me fait exploser la tête. Cependant, j'aime bien la puissance derrière elle, surtout lorsqu'elle est utilisée avec le modèle MVVM. J'ai un ControlTemplate qui contient un Button. J'utilise ce ControlTemplate à l'intérieur d'un contrôle personnalisé. Je veux ajouter une propriété sur le contrôle personnalisé qui se liera à la propriété de commande du Button à l'intérieur du ControlTemplate. Fondamentalement, il s'agit d'un ComboBox avec un Button à droite pour permettre à un utilisateur d'ouvrir une boîte de dialogue de recherche. Comme ce contrôle peut apparaître plusieurs fois sur un contrôle utilisateur, je dois potentiellement lier chaque contrôle à une commande différente (recherche de produits, recherche de clients, etc.).Dans WPF, comment obtenir une commande dans un modèle de contrôle pour lier à une propriété dans un parent?

Cependant, j'ai été incapable de comprendre comment faire ceci.

Voici quelques exemple XAML:

<Style TargetType="{x:Type m:SelectionFieldControl}"> 
    <Setter Property="LookupTemplate" Value="{StaticResource LookupTemplate}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type m:SelectionFieldControl}"> 
       <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
          Padding="{TemplateBinding Control.Padding}" 
          BorderBrush="{TemplateBinding Border.BorderBrush}" 
          Background="{TemplateBinding Panel.Background}" 
          SnapsToDevicePixels="True" 
          Focusable="False"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" MinWidth="0" 
               SharedSizeGroup="{Binding LabelShareSizeGroupName, 
                     RelativeSource={RelativeSource FindAncestor, 
                       AncestorType={x:Type m:BaseFieldControl}}}" /> 
          <ColumnDefinition Width="1*" /> 
          <ColumnDefinition Width="Auto" 
               SharedSizeGroup="{Binding WidgetsShareSizeGroupName, 
                     RelativeSource={RelativeSource FindAncestor, 
                       AncestorType={x:Type m:BaseFieldControl}}}" /> 
         </Grid.ColumnDefinitions> 

         <!-- Customized Value Part --> 
         <ComboBox x:Name="PART_Value" 
            Grid.Column="1" 
            Margin="4,2,0,1" 
            SelectedValue="{Binding Path=SelectionField.Value, 
                  RelativeSource={RelativeSource FindAncestor, 
                         AncestorType={x:Type m:SelectionFieldControl}}}" 

            IsEnabled="{Binding Field.IsNotReadOnly, 
                 RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}" 
            Visibility="{Binding Field.IsInEditMode, Converter={StaticResource TrueToVisible}, 
                 RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type m:SelectionFieldControl}}}" 

            FontFamily="{StaticResource FontFamily_Default}" FontSize="11px"> 
          <ComboBox.ItemsPanel> 
           <ItemsPanelTemplate> 
            <VirtualizingStackPanel IsVirtualizing="True" 
                  VirtualizationMode="Recycling"/> 
           </ItemsPanelTemplate> 
          </ComboBox.ItemsPanel> 
         </ComboBox> 

         <StackPanel Grid.Column="2" 
            Orientation="Horizontal" 
            Name="PART_Extra" 
            Focusable="False"> 

          <ContentControl Name="PART_LookupContent" 
              Template="{Binding LookupTemplate, 
                   RelativeSource={RelativeSource FindAncestor, 
                           AncestorType={x:Type m:SelectionFieldControl}}}" 
              Focusable="False"/> 
         </StackPanel> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Je pensais que je pouvais le faire fonctionner en faisant quelque chose comme ceci:

<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type SelectionFieldControl}}, Path=ShowSearchCommand}" Margin="2" /> 

mais il ne fonctionne pas.

Toute aide serait grandement appréciée.

Répondre

1

Doh!

Cela fonctionne. Le problème était que ma propriété de dépendance n'utilisait pas UIPropertyMetadata pour les propriétés Meta lors de l'enregistrement de la propriété.

public ICommand ShowSearchCommand { get { return (ICommand)GetValue(ShowSearchCommandProperty); } set { SetValue(ShowSearchCommandProperty, value); } }

public static readonly DependencyProperty ShowSearchCommandProperty = 
     DependencyProperty.Register("ShowSearchCommand", typeof(ICommand), 
      typeof(SelectionFieldControl), 
      new UIPropertyMetadata(OnShowSearchCommandChanged)); 

    static void OnShowSearchCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 

    }