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.
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
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
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