2009-10-29 5 views
1

J'ai un problème en essayant de faire quelque chose qui devrait être aussi simple que. J'ai essayé d'utiliser un Trigger basé sur un DependencyProperty ou un DataTrigger - je ne peux pas obtenir l'un ou l'autre au travail.WPF - Le déclencheur ne se déclenche pas

XAML pour le déclencheur est:

<Style x:Key="FileWatchButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}"> 
    <Style.Triggers> 
     <Trigger Property="Main:Main.XmlFilesAvailableForLoading" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Et le code-behind associé est:

public static readonly DependencyProperty XmlFilesAvailableForLoadingProperty = 
DependencyProperty.Register("XmlFilesAvailableForLoading", typeof(bool), typeof(Main)); 

public bool XmlFilesAvailableForLoading 
{ 
    get 
    { 
     try 
     { 
      return (bool)this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind, 
        (System.Windows.Threading.DispatcherOperationCallback)delegate { return GetValue(XmlFilesAvailableForLoadingProperty); }, 
        XmlFilesAvailableForLoadingProperty); 
     } 
     catch (Exception) 
     { 
      return (bool)XmlFilesAvailableForLoadingProperty.DefaultMetadata.DefaultValue; 
     } 
    } 
    set 
    { 
     this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.DataBind, 
       (System.Threading.SendOrPostCallback)delegate{ SetValue(XmlFilesAvailableForLoadingProperty, value); }, value); 
    } 
} 

Fondamentalement, le dp est réglé correctement par le présentateur (il est basé sur une classe FileSystemWatcher recherche pour un ou plusieurs fichiers) mais le Trigger n'est pas déclenché. Est-ce un problème de threading?

Merci.

Répondre

1

Il n'est pas clair si le code est complet, mais il semble que le chemin de propriété dans votre déclencheur soit erroné. Est-ce que le bouton en cours de style possède une propriété Main? Je ne devine pas; il semble que vous essayez de déclencher sur une propriété d'un élément différent, appelé Main - est-ce exact?

Dans tous les cas, le préfixe d'espace de noms n'est pas requis. Si le bouton a une propriété nommée Main, vous pouvez l'adresser directement; Si ce n'est pas le cas, le préfixe ne vous aidera pas.

Je pense que vous avez probablement besoin d'un DataTrigger dont la liaison se réfère à l'élément principal:

<local:Main Name="MyMain" ... /> <!-- this has the XmlFilesAvailableForLoading property --> 

<DataTrigger Binding="{Binding XmlFilesAvailableForLoading, ElementName=MyMain}" 
      Value=True> 
    <Setter Property="Background" Value="Red" /> 
</DataTrigger> 

Sur une note sans rapport, vous devriez avoir une mise en œuvre non boilerplate dans votre getter DP et setter. Rappelez-vous que le système de reliure et de style contournera le getter et le setter et parlera directement au stockage sous-jacent. Donc, je vous conseille fortement de les changer pour les appels simples GetValue et SetValue.

+0

Si j'ai le getter/setter standard dans ma propriété, j'obtiens l'exception: "Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède." I.e. Je dois utiliser un getter/setter sûr. Main est la fenêtre dans laquelle se trouve le bouton que j'essaye de styler via un déclencheur. J'ai essayé le DataTrigger suivant, qui me semble être syntaxiquement correct mais ne fait rien: P.s. le bouton n'a pas de propriété Main, j'essaye de me déclencher sur XmlFilesAvailable. – pFrenchie

+0

Votre DataTrigger est syntaxiquement correct, mais recherchera une propriété XmlFilesAvailableForLoading dans le contexte de données local. Est-ce exact? De votre échantillon de code, il semblait que cette propriété était sur Main. Si tel est le cas, vous pouvez utiliser ElementName comme indiqué dans mon exemple de liaison, ou RelativeSource AncestorType, pour que la liaison DataTrigger recherche la propriété au bon endroit (l'élément Main). – itowlson

+0

Juste pour réitérer, Main est la fenêtre dans laquelle les contrôles sont hébergés, et XmlFilesAvailableForLoading est une propriété publique de la fenêtre - d'où il devrait être de contexte de données locales. J'ai essayé d'ajouter le ElementName comme montré dans votre exemple de code mais en vain (c'est-à-dire qu'il compile et s'exécute, mais rien ne se passe). – pFrenchie

Questions connexes