none
Datatrigger sur label qui ne fonctionne pas avec les labels inclus dans un UserControl RRS feed

  • Question

  • Bonjour

    J'ai créer un datatrigger pour modifier dynamiquement le look des labels. Mais ce datatrigger fonction bien lorsque mon label est inséré directement dans une fenêtre, mais ne fonctionne plus lorsque le label est inclu dans un UserControl. Voici le source de mon exemple.

    <Application x:Class="WpfApplication1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <Style  x:Key="StyleEtoile">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=frm , Path=IsModification}" Value="true" >
                        <Setter Property="Label.FontWeight" Value="Bold"/>
                        <Setter Property="Label.Foreground" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Application.Resources>
    </Application>
    
    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" x:Name="frm" xmlns:my="clr-namespace:WpfApplication1">
        <Grid>
            <Label Content="coucou" Margin="0,0,0,0" Style="{StaticResource StyleEtoile}" VerticalAlignment="Top"/>
            <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="150,163,0,0" Name="button1" 
                    VerticalAlignment="Top" Width="75" Click="button1_Click" />
            <my:LabelEtoilee Margin="100,100,0,0" x:Name="labelEtoilee1" VerticalAlignment="Top" />
        </Grid>
    </Window>
    using System;
    using System.Windows;
     
    namespace WpfApplication1 {
      /// <summary>
      /// Logique d'interaction pour MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window {
     
     
        public Boolean IsModification {
          get {
            return (Boolean)GetValue(IsModificationProperty);
          }
          set {
            SetValue(IsModificationProperty, value);
          }
        }
     
        public static readonly DependencyProperty IsModificationProperty = DependencyProperty.RegisterAttached(
          "IsModification",
          typeof(Boolean),
          typeof(MainWindow),
          new FrameworkPropertyMetadata(falseFrameworkPropertyMetadataOptions.AffectsRender)
          );
     
        public MainWindow() {
          InitializeComponent();
        }
     
        private void button1_Click(object sender, RoutedEventArgs e) {
          IsModification = !IsModification;
        }
      }
    }
    <UserControl x:Class="WpfApplication1.LabelEtoilee"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="34" d:DesignWidth="300">
        <TextBlock>
            <Label Content="Label" Height="Auto" Name="label1" Style="{StaticResource StyleEtoile}" />
        </TextBlock>
    </UserControl>
    Quelqu'un a t-il une idée pour solutionner mon problème ? Merci d'avance pour votre aide

    TEDFR
    • Modifié TEDFR vendredi 30 septembre 2011 14:11
    vendredi 30 septembre 2011 14:10

Réponses

  • Dans ce cas utilise cela (sans l'ElementName donc...):

     

        <DataTrigger Binding="{Binding Path=IsModification,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window }}}" Value="true" >



    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com
    lundi 3 octobre 2011 13:50
    Modérateur

Toutes les réponses

  • Hello,

     

    Y-a-t'il des messages d'erreurs dans la fenêtre de sortie ?


    Est-ce que ton UserControl défini la proprieté IsModification ?


    Bon courage, 


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn  - http://www.jonathanantoine.com

    lundi 3 octobre 2011 08:18
    Modérateur
  • Bonjour Jonathan,

     

    Non aucun message d'erreur.

     

    Non mon UserControl ne défini pas la propriété IsModification.

     

     


    TEDFR
    lundi 3 octobre 2011 10:22
  • Bonjour,

     

    Je pense savoir  ce qui se passe. Ton style va rechercher la propriété sur ton UserControl qui ne la défini pas. Essaye de remplacer la définition par cette ligne.

        <DataTrigger Binding="{Binding ElementName=frm , Path=IsModification,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window }}}" Value="true" >


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com
    lundi 3 octobre 2011 10:37
    Modérateur
  • Re bonjour,

    En effectuant cette modification, j'obtiens le message d'erreur à l'exécution : La propriété Set 'System.Windows.Data.Binding.RelativeSource' a levé une exception.' numéro de ligne '8' et position de ligne '30'.


    TEDFR
    lundi 3 octobre 2011 12:45
  • Pourrais tu me donner l'erreur omplète stp ?
    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com
    lundi 3 octobre 2011 13:10
    Modérateur

  • TEDFR
    lundi 3 octobre 2011 13:25
  • Dans ce cas utilise cela (sans l'ElementName donc...):

     

        <DataTrigger Binding="{Binding Path=IsModification,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window }}}" Value="true" >



    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com
    lundi 3 octobre 2011 13:50
    Modérateur
  • Super bravo. Cela marche très bien ainsi.

    Un grand merci.


    TEDFR
    lundi 3 octobre 2011 14:20