IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[DataTemplate] Comment le rafraichir en code


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut [DataTemplate] Comment le rafraichir en code
    Bonjour
    voici mon probleme
    j'ai deux dictionnaires de style
    - StyleA.xaml
    - StyleB.xaml

    dans chacun d'eux
    j'ai une definition pour un datatemplate sur un type
    dans StylaA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     <BitmapImage x:Key="image"
                     UriSource="a.png" />
        <DataTemplate DataType="{x:Type local:Personne}">
            <StackPanel Orientation="Vertical">
                <TextBlock Text="Nom" />
                <TextBox Text="{Binding Nom}" />
                <TextBlock Text="Prenom" />
                <TextBox Text="{Binding Prenom}" />
            </StackPanel>
        </DataTemplate>
    et dans StyleB
    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
        <BitmapImage x:Key="image"
                     UriSource="b.png" />
        <DataTemplate DataType="{x:Type local:Personne}">
            <StackPanel Orientation="Vertical">
                <DockPanel Margin="0,2,0,0">
                    <TextBlock Text="Nom"
                               DockPanel.Dock="Left"
                               Width="100" VerticalAlignment="Center"/>
                    <TextBox Text="{Binding Nom}" />
                </DockPanel>
                <DockPanel Margin="0,2,0,0">
                    <TextBlock Text="Prenom"
                               DockPanel.Dock="Left"
                               Width="100" VerticalAlignment="Center"/>
                    <TextBox Text="{Binding Prenom}" />
                </DockPanel>
            </StackPanel>
        </DataTemplate>
    quand j'inverse les styles (switch des dictionnaires) je vois bien mon image (keey=image) changer mais le style applicqué automatique au contentControl qui contient une Personne ne change pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <Border Padding="5"
                    BorderBrush="Black"
                    BorderThickness="1"
                    CornerRadius="4"
                    Margin="10,10,10.4,64.4">
                <ContentControl Content="{Binding .}"
                                Margin="10" />
            </Border>
    j'aimerais savoir comment je peux forcer le rafraichissement en code simplement

    merci
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    j'ai trouvé une solution qui fonctionne
    mais pas sexy du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new Personne { Nom = "dupont", Prenom = "jean" };
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                (App.Current as App).ChangeStyle();
                object o = this.DataContext;
                this.DataContext = null;
                this.DataContext = o;
            }
    si vous avez mieux
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    quand j'inverse les styles (switch des dictionnaires) je vois bien mon image (keey=image) changer mais le style applicqué automatique au contentControl qui contient une Personne ne change pas
    Premierement je ne vois pas les Styles dans tes "Dictionaries" StyleA et StyleB....mais bel et bien 2 DataTemplates...
    Deuxiement ton Binding du ContentControl est "pipe" parce que :
    - sa prop Content (les Donnees) n'est pas binde
    - sa prop ContentTemplate doit etre binde à un DataTemplate Moyennant une "clé" ou Key,laquelle peut etre la meme si elle figure dans 2 ou plus de Dictionary...
    Tertio,ce qu'il ne faut jamais oublier ,lorsque on bascule ou "switch" des Styles ou des DataTemplates au Run-Time contenus dans des Resources(Dictionnary),la liaison doit etre specifier comme ......DynamicResource.!!!

    voici le code exemple
    1/code .cs du Class data

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
     
    namespace WpfChangeTheme2
    {
        public class Person : INotifyPropertyChanged
        {
            public Person()
            {
                FName = "dupont";
                LName = "jean";
            }
            public Person(string fn, String ln)
                : this()
            {
                FName = fn;
                LName = ln;
     
            }
            private String fname;
            public String FName
            {
                get { return fname; }
                set { fname = value; RaisePropertyChange("FName"); }
            }
            private String lName;
            public String LName
            {
                get { return lName; }
                set { lName = value; RaisePropertyChange("LName"); }
            }
     
     
            public event PropertyChangedEventHandler PropertyChanged;
            private void RaisePropertyChange(string n)
            {
                PropertyChangedEventHandler h = PropertyChanged;
                if (h != null)
                    h(this, new PropertyChangedEventArgs(n));
     
            }
        }
    }
    code xam de Dictionary1(StyleA):
    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
    24
     
     
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:WpfChangeTheme2">
     
     
        <BitmapImage x:Key="image"
                     UriSource="Images/img1.jpg" />
     
        <DataTemplate
            x:Key="dt" DataType="{x:Type local:Person}">
            <StackPanel Orientation="Vertical">
                <TextBlock 
                    Foreground="Red" 
                    Text="FName" />
                <TextBox Text="{Binding FName}" />
                <TextBlock
                    Foreground="Red" 
                    Text="LName" />
                <TextBox Text="{Binding LName}" />
            </StackPanel>
        </DataTemplate>
    </ResourceDictionary>
    code xam de Dictionary2 (StyleB):

    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
    24
    25
    26
    27
    28
    29
     
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                         xmlns:local="clr-namespace:WpfChangeTheme2">
     
        <BitmapImage x:Key="image"
                     UriSource="Images/img2.jpg" />
        <DataTemplate 
            x:Key="dt"   DataType="{x:Type local:Person}">
            <StackPanel Orientation="Vertical">
                <DockPanel Margin="0,2,0,0">
                    <TextBlock 
                        Foreground="DarkBlue"
                        Text="Nom"
                        DockPanel.Dock="Left"
                        Width="100" VerticalAlignment="Center"/>
                    <TextBox Text="{Binding FName}" />
                </DockPanel>
                <DockPanel Margin="0,2,0,0">
                    <TextBlock
                        Foreground="DarkBlue"
                        Text="Prenom"
                        DockPanel.Dock="Left"
                        Width="100" VerticalAlignment="Center"/>
                    <TextBox Text="{Binding LName}" />
                </DockPanel>
            </StackPanel>
        </DataTemplate>
    </ResourceDictionary>
    code xam de App:
    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
     
    <Application x:Class="WpfChangeTheme2.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfChangeTheme2"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
     
                <ResourceDictionary>
                    <SolidColorBrush x:Key="BackgroundColor" Color="Yellow"/>
                    <ResourceDictionary x:Key="dic1"  Source="Dictionary1.xaml"/>
                    <ResourceDictionary x:Key="dic2"  Source="Dictionary2.xaml"/>
     
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary   Source="Dictionary1.xaml"/>
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
     
     
        </Application.Resources>
    </Application>
    code xam du Form:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <Window x:Class="WpfChangeTheme2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfChangeTheme2"
            Title="MainWindow" Height="350" Width="525"
             >
        <Window.Resources>
            <local:Person x:Key="p"/>
        </Window.Resources>
        <StackPanel DataContext="{Binding Source={StaticResource p}}" >
            <Button 
                x:Name="ChangeStyle" 
                Content="ChangeStyle"
                FontSize="24"
                Foreground="Black"  
                Click="ChangeStyle_Click" >
                <Button.Background>
                    <ImageBrush  ImageSource="{StaticResource image}" />
                </Button.Background>
            </Button>
     
            <Border Padding="5"
                    BorderBrush="Black"
                    BorderThickness="1"
                    CornerRadius="4"
                    Margin="10,10,10.4,64.4">
                <ContentControl 
                    Content="{Binding }"
                    ContentTemplate="{DynamicResource    dt}"
                                Margin="10" />
            </Border>
        </StackPanel>
     
    </Window>
    code behind .cs du Form:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
     
    namespace WpfChangeTheme2
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            bool IsStyleChanged = false;
            public MainWindow()
            {
                InitializeComponent();
            }
     
            private void ChangeStyle_Click(object sender, RoutedEventArgs e)
            {
     
                ResourceDictionary newDictionary = new ResourceDictionary();
                if( !IsStyleChanged )
                {
                    newDictionary.Source = new Uri("Dictionary2.xaml", UriKind.Relative);
                    Application.Current.Resources.MergedDictionaries.Clear();
                    Application.Current.Resources.MergedDictionaries.Add(newDictionary);
                    IsStyleChanged = !IsStyleChanged;
                }
                else
                {
                    newDictionary.Source = new Uri("Dictionary1.xaml", UriKind.Relative);
                    Application.Current.Resources.MergedDictionaries.Clear();
                    Application.Current.Resources.MergedDictionaries.Add(newDictionary);
                    IsStyleChanged = !IsStyleChanged;
                }
     
            }
        }
    }

    bon code...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Merci
    effectivement j'avais bien pensé a rajouter une clef pour avoir un dynamicresource et je suppose que ça fonctionne bien avec le code que tu m'as filé
    ceci étant dans l'exemple que j'ai fait il n'y a qu'un seul datatemplate mais ma "réalité" c'est une liste box avec des objets multiples bref une résolution des datatemplate sur le type pas sur une clef
    en fait plus pragmatiquement je voulais savoir si l'on pouvait informer le système qu'il fait réinterpréter les objets pour leur trouver le datatemplate en cours (comme cela est fait quand tu l'affiche la première fois)

    parallèlement si j'ai un code avec une liste box qui contient deux objets
    A et B puis un contentcontrol qui contient le selectitem de la liste box (donc l'objet sélectionné)
    a t0 j'ai A sélectionné le datatemplate du style 1 s'applique
    a t1 si je change le style pour style 2 (rien ne se passe sur le contentcontrol)
    si je sélectionne B dans la liste puis A le nouveau style 2 s'applique alors (c'est pour cela que ma solution pas sexy s'applique ....)
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

Discussions similaires

  1. Comment bien déboguer son code ?
    Par D[r]eadLock dans le forum Débuter
    Réponses: 47
    Dernier message: 02/04/2024, 16h06
  2. [DBGRID] Comment derouler par le code une picklist ?
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/09/2004, 11h57
  3. [JDevelopper] Comment indenter automatiquement le code ??
    Par Bicnic dans le forum JDeveloper
    Réponses: 5
    Dernier message: 03/08/2004, 21h11
  4. [VB6] comment renvoyer un exit code en VB6 ?
    Par VVE dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/05/2004, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo