2015-11-19 1 views
-1

Avoir une demande étrange. J'ai besoin d'être averti quand une ressource dynamique change par rapport à un FrameworkElement, mais je ne définis pas une propriété sur ce FrameworkElement. En tant que tel, je ne peux pas utiliser {DynamicResource someKey} en XAML, ni someElement.SetResourceReference() en code-behind.Comment pouvez-vous être averti des modifications de DynamicResource (par rapport à un FrameworkElement particulier) sans avoir de DependencyProperty pour le définir?

Maintenant obtenir la valeur actuelle est facile. Vous appelez simplement someElement.FindResource("someKey") et vous obtenez quelle que soit la valeur actuelle, mais cela nécessite une interrogation. J'ai envisagé de créer un faux objet source de liaison auquel je pourrais ensuite me lier, mais le problème est qu'il ne fait pas partie de l'arborescence visuelle, donc à moins que cette ressource ne soit définie au niveau de l'application, vous ne l'obtiendrez pas. Vous ne pouvez pas non plus bloquer des choses dans l'arbre visuel.

J'ai vu une réponse qui utilise des comportements qui peuvent définir une DependencyProperty, et lorsqu'ils sont attachés à FrameworkElement, ils se mettent à jour comme on le soupçonnerait, mais cela nécessite XAML puisque je ne sais pas comment appeler les Behaviors- équivalent de setResourceReference de FrameworkElement.

Alors ... des pensées?

+0

Pourquoi auriez-vous besoin d'une telle chose? Êtes-vous sûr que la ressource est la voie à suivre? –

+0

lol ... J'aime quand les gens commentent l'usage plutôt que la question. Oui, ça doit être une ressource. Je l'ai simplifié à l'extrême pour obtenir les informations de base dont j'ai besoin, c'est-à-dire pouvoir lier une ressource dynamique et la transmettre à travers un convertisseur. J'ai effectivement trouvé une solution sous la forme d'une DynamicResourceExtension où dans ProvideValue j'obtiens la valeur de base de ProvideValue(), définissez cela comme la valeur d'un Dp de type objet sur un comportement personnalisé, ajoutez le comportement aux comportements de l'élément de framework cible , puis aussi l'utiliser comme la source d'une liaison où je mets le convertisseur et le retour. – MarqueIV

Répondre

0

Il est difficile de donner une réponse satisfaisante sans l'utilisation. La solution de propriété jointe Comportement A.K.A fonctionnera mais elle utilise un DependencyProperty.

public static class AttachedProperty 
{ 
    public static readonly DependencyProperty DynamicResourceProperty = DependencyProperty.RegisterAttached("DynamicResource", typeof(object), typeof(AttachedProperty), new PropertyMetadata(null)); 

    public static object GetDynamicResource(DependencyObject obj) 
    { 
     return (object)obj.GetValue(DynamicResourceProperty); 
    } 

    public static void SetDynamicResource(DependencyObject obj, object value) 
    { 
     obj.SetValue(DynamicResourceProperty, value); 
    } 
} 

Vous définissez la propriété attachée sur l'élément pour lequel vous souhaitez suivre la ressource.

<Grid x:Name="grid" my:AttachedProperty.DynamicResource="{DynamicResource Brush}"/> 

Et c'est un DependecyProperty vous pouvez lier à, recevoir des notifications et de transmettre la valeur aux convertisseurs.

+0

Pas tout à fait. Après tout, qu'est-ce que vous liez cette propriété à l'endroit où vous utilisez le convertisseur? Vous avez besoin d'un autre objet comme cible avec sa propre propriété de dépendance, en utilisant celui-ci comme source. De plus, vous devrez créer différentes propriétés attachées pour chaque utilisation. (Par exemple, vous ne pouvez pas avoir deux liaisons de ressources dynamiques sur le même objet de cette façon.) Alors que ma solution Behavior fait de nouveaux objets en interne, tout ce qui est caché à l'utilisateur l'utilise comme une liaison normale. Je posterai ma solution dès qu'elle sera nettoyée. – MarqueIV

+0

BTW, pourquoi avez-vous voté ma question? – MarqueIV

+0

Je n'ai pas, mais je suis d'accord ce n'est pas une bonne question, afficher l'utilisation dans le code, et quand il devient clair ce que vous essayez de faire et la question peut servir d'autres utilisateurs, je vais le remettre en question. –