Bonjour,
Je cherche à faire mon propre MarkupExtension afin de binder une property et de renvoyer une ressource correspondant à la valeur de la propriété.
J'ai donc créer la classe ResourceKeyBindingExtension qui hérite de MarkupExtension et j'encapsule un Binding (l'heritage directe de Binding n'est pas possible car la fonction ProvideValue est sealed)
dans la fonction ProvideValue, je récupère le DataContext de l'objet cible de mon marqueur pour l'utiliser en tant que source de mon binding et je tente de récupérer la valeur et d'obtenir la ressource associée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class ResourceKeyBindingExtension : MarkupExtension { private Binding resourceKeyBinding; public ResourceKeyBindingExtension() { resourceKeyBinding = new Binding(); } public PropertyPath Path { get { return resourceKeyBinding.Path; } set { resourceKeyBinding.Path = value; } } ..... public override object ProvideValue(IServiceProvider serviceProvider) { .... } }
Ensuite,J'utilise ResourceKeyBindingExtension directement dans un usercontrol
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if(target != null) { FrameworkElement targetElement = target.TargetObject as FrameworkElement; if(targetElement != null) resourceKeyBinding.Source = targetElement.DataContext; } if(resourceKeyBinding.Source != null) { StaticResourceExtension resource = new StaticResourceExtension(); resource.ResourceKey = resourceKeyBinding.ProvideValue(serviceProvider); return resource.ProvideValue(serviceProvider); } else return "";
Je passe bien dans la fonction ProvideValue mais lorsque le DataContext de mon UserControl n'est pas encore définit. Lorsque je définit le DataContext je ne repasse pas dans ProvideValue.
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <UserControl x:Class="MyApp.MyControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:MyApp"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/ResourceDictionary.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <UserControl.Content> <my:ResourceKeyBindingExtension Path="Name" /> </UserControl.Content > </UserControl>
Avez vous une idée pour résoudre mon problème?
Merci
Partager