Bonjour à tous,
est-il possible de binder un fichier XML dans un XAML et que celui-ci ne soit pas incorporé à l'application? Si oui, comment pourrais-je procéder?
Merci pour votre aide.
Version imprimable
Bonjour à tous,
est-il possible de binder un fichier XML dans un XAML et que celui-ci ne soit pas incorporé à l'application? Si oui, comment pourrais-je procéder?
Merci pour votre aide.
Tu as essayé avec un XmlDataProvider ? De mémoire, tu peux le faire pointer vers un fichier "distant"
J'ai fait comme ça :
Evidemment dans ce cas le fichier est incorporé ... On peut faire pointer sur un fichier distant mais je vois pas trop comment le faire dans mon cas ...Code:
1
2
3
4<XmlDataProvider Source="/Data/monFichier.xml" ...
Ben, tu as essayé ca:
?Code:
1
2
3<XmlDataProvider Source="C:\temp\monFichier.xml" ...
Oui biensûr mais comment faire pour avoir un chemin relatif? Genre répertoire courant où s'exécute le programme?
tu as essayer avec ./monfichier.xml ?
Ben ouep imais ça ne fonctionne pas ... C'est pour ça que je me demandais si il n'y avait pas une méthode spécifique pour que le fichier ne soit pas incorporé à l'appli :oops:
J'ai bien une idée mais je garantie pas le résultat...
Tu créés une classe statique qui va lire un fichier de configuration (dans lequel tu auras mis l'adresse de ton fichier XML) et tu exposes une méthode statique qui va te retourner cette adresse.
Ensuite, dans ton XAML, tu créés un ObjectDataProvider qui appelles ta méthode statique et tu lies la propriété Source de ton XmlDataProvider à ton ODP :)
Voici un exemple, plus simple même.
Une classe qui va chercher dans les settings l'adresse de ton fichier XML:
Code:
1
2
3
4
5
6
7 public static class Configurator { public static string GetXmlFileUri() { return Properties.Settings.Default.XmlFileUri; } }
Ensuite, dans ton XAML, tu utilises un contrôle (ItemsControl) qui est lié à un XmlDataProvider:
Le problème, c'est qu'on ne peut pas faire de binding sur la propriété Source du XmlDataProvider car ce n'est pas une DependencyProperty. Pour pallier à ca, on met simplement ce code, lors du chargement de la Window:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <Window x:Class="TestXmlDataProvider.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> <Window.Resources> <XmlDataProvider x:Key="xml" /> </Window.Resources> <Grid> <ListBox HorizontalAlignment="Center" VerticalAlignment="Center" Height="100" Width="100" ItemsSource="{Binding Source={StaticResource xml}}" /> </Grid> </Window>
En gros, lorsque la fenêtre se charge, on récupèe le XmlDataProvider qui est dans les ressources et on affecte sa source "à la main" :)Code:
1
2
3
4
5
6
7
8
9 private void Window_Loaded(object sender, RoutedEventArgs e) { var xml = this.TryFindResource("xml") as XmlDataProvider; if (xml != null) { xml.Source = new Uri(Configurator.GetXmlFileUri()); xml.XPath = "/Products/Product/@Name"; } }
Testé et approuvé :)
Merci pour ton aide, pas mal du tout ton exemple :)
Sinon j'ai fait cela :
Cela fonctionne, mais est-ce correct de cette manière?Code:
1
2
3<XmlDataProvider Source="pack://siteoforigin:,,,/config/framesConfiguration.xml" ...
Je ne suis pas sur que l'utilisation de "pack://siteoforigin" soit recommandé mais c'est à vérifier...
D'accord :) En tout cas merci c'est résolu!