2010-01-04 14 views
4

J'ai une propriété de dépendance personnalisée que j'aimerais utiliser comme déclencheur de données. Voici le code derrière:Utilisation de propriétés de dépendance personnalisées en tant que DataTrigger dans WPF

public static readonly DependencyProperty BioinsulatorScannedProperty = 
    DependencyProperty.Register(
     "BioinsulatorScanned", 
     typeof(bool), 
     typeof(DisposablesDisplay), 
     new FrameworkPropertyMetadata(false)); 

    public bool BioinsulatorScanned 
    { 
     get 
     { 
      return (bool)GetValue(BioinsulatorScannedProperty); 
     } 
     set 
     { 
      SetValue(BioinsulatorScannedProperty, value); 
     } 
    } 

J'ai créé un style et un modèle de contrôle. Mon but est de changer la couleur de texte lorsque l'accessoire de dépendance est définie sur true ...

<Style x:Key="TreatEye" TargetType="Label"> 
     <Setter Property="Foreground" Value="#d1d1d1" /> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="FontSize" Value="30" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Label"> 
        <Canvas>        
         <TextBlock x:Name="bioinsulatorText" 
            Canvas.Left="21" Canvas.Top="33" 
            Text="Bioinsulator" /> 
         <TextBlock Canvas.Left="21" Canvas.Top="70" 
            Text="KXL Kit" /> 
        </Canvas> 

        <ControlTemplate.Triggers> 
         <DataTrigger Binding="{Binding BioinsulatorScanned}" 
            Value="True"> 
          <Setter TargetName="bioinsulatorText" 
            Property="Foreground" Value="Black" /> 
         </DataTrigger> 
        </ControlTemplate.Triggers> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter>    
    </Style> 

Malgré la mise avec succès l'hélice de dépendance à la vraie programmation, cette condition de déclenchement ne se déclenche jamais. C'est une vraie douleur à déboguer!

Merci d'avance.

+0

Sur quel objet avez-vous défini votre propriété de dépendance? –

+0

Je ne suis pas sûr de comprendre exactement, mais j'essaie d'utiliser la propriété de dépendance dans la section ControlTemplate.Triggers. Quand c'est vrai, j'ai besoin de texte dans "bioinsulatorText" pour devenir noir. – BabaBooey

Répondre

2

Il semble que votre propriété de dépendance soit définie dans un objet DisposableDisplay que vous avez créé. Pour que la liaison spécifiée fonctionne, une instance de cet objet DisposableDisplay doit être définie comme DataContext du contrôle (étiquette dans ce cas) ou de l'un de ses ancêtres.

+0

Cela fonctionne parfaitement. En tant que novice WPF, j'ai trouvé que la liaison de données était l'un des sujets les plus problématiques. Dans quels cas DataContext n'a-t-il pas besoin d'être défini? – BabaBooey

+0

'DataContext' est défini par défaut lorsque vous utilisez des modèles de données. Les modèles de données sont utilisés par défaut dans les contrôles d'éléments (zones de liste, vues de liste, grilles de données, etc.). Vous pouvez également définir explicitement le datacontext sur n'importe quel élément pour faciliter la liaison. C'est l'un des concepts les plus importants de WPF. –

3

Dans ce cas, je change la visibilité d'un bouton à l'aide d'un datatrigger basé sur une propriété de dépendance FirstLevelProperty.

public static readonly DependencyProperty FirstLevelProperty = DependencyProperty.Register("FirstLevel", typeof(string), typeof(MyWindowClass)); 

public string FirstLevel 
     { 
      get 
      { 
       return this.GetValue(FirstLevelProperty).ToString(); 
      } 

      set 
      { 
       this.SetValue(FirstLevelProperty, value); 
      } 
     } 

Vous pouvez référencer la propriété de dépendance FirstLevel(Property) contenue (dans ce cas) dans une fenêtre en utilisant le RelativeSource obligatoire. Vous devez également définir le paramètre par défaut dans le style, qui sera remplacé par le Datatrigger.

<Button.Style> 
    <Style TargetType="Button"> 
     <Style.Triggers> 
      <DataTrigger 
      Binding="{Binding Path=FirstLevel, 
      RelativeSource={RelativeSource FindAncestor, 
      AncestorType={x:Type Window}}}" 
      Value="SomeValue"> 
       <Setter Property="Visibility" 
       Value="Hidden" /> 
      </DataTrigger> 
     </Style.Triggers> 
     <Setter Property="Visibility" Value="Visible" /> 
    </Style> 
</Button.Style>