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 :

[WPF] Binding Ancestor depuis un ResourceDictionary vers le ViewModel ne fonctionne pas [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Points : 141
    Points
    141
    Par défaut [WPF] Binding Ancestor depuis un ResourceDictionary vers le ViewModel ne fonctionne pas
    Coucou,

    J'ai cherché quelques solution sur le net, mais aucune n'a fonctionné, je dois oublier quelque chose, c'est pourquoi je demande votre aide.
    Voici mon problème :
    J'ai une MainView sur laquelle j'ai placé ce ComboBox :
    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
     
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Model/DictionaryAltered.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
     
    <ComboBox x:Name="cbTitle"
                              Grid.Row="1" 
                              MaxDropDownHeight="260"
                              ToolTip="{Binding CurrentPersonnage.Illustrateur}"
                              Style="{DynamicResource ComboBoxStyleTitre}" 
                              ItemTemplate="{StaticResource templateComboTitre}"
                              HorizontalContentAlignment="Center"
                              VerticalContentAlignment="Center"
                              FontSize="14"
                              FontWeight="Bold"
                              Foreground="White"
                              Grid.Column="2"
                              SelectionChanged="cbTitle_SelectionChanged"
                              Margin="49,5,0,0"
                              Height="30"
                              >
                        <ComboBox.Resources>
                            <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="Black" Opacity="0.3" />
                        </ComboBox.Resources>
                    </ComboBox>
    J'ai lié sa source coté code Behind, d'un ObservableCollection<PersonnageItem>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cbTitle.ItemsSource = TitrePersonnage.Instance().PersonnageItems;
    Son template est défini dans un ResourceDictionary :
    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
     
        <DataTemplate x:Key="templateComboTitre" > 
            <Grid Height="22">
                <Grid>
                    <Grid.Background>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                            <GradientStop Offset="0.0" Color="{Binding Faction, Converter={StaticResource FactionToColorConverter}}"/>
                            <GradientStop Offset="1.0" Color="{Binding OOF, Converter={StaticResource FactionToColorConverter}}"/>
                        </LinearGradientBrush>
                    </Grid.Background>
                    <TextBlock x:Name="txtPersonnageNom" VerticalAlignment="Center" Panel.ZIndex="0" Grid.Column="1" Grid.ColumnSpan="2" HorizontalAlignment="Center" Text="{Binding NomString}"></TextBlock>
                </Grid>
     
                <Grid Width="270">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="2*" />
                        <ColumnDefinition Width="2*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Image x:Name="imgPersonnageFaction" Margin="2" Grid.Column="0" HorizontalAlignment="Left" Source="{Binding Path=FactionImagePath}" />
                    <Button x:Name="btnPersonnageFaction" Command="{Binding DataContext.SelectFactionCommand, RelativeSource={RelativeSource AncestorType=vm:MainViewModel}}" Grid.Column="1" BorderThickness="0" Background="Transparent" />
                    <Button x:Name="btnPersonnageOOF" Grid.Column="2" BorderThickness="0" Background="Transparent" />
                    <Image x:Name="imgPersonnageOOF" Margin="2" Grid.Column="3" HorizontalAlignment="Right" Source="{Binding Path=OOFImagePath}" />
                </Grid>
            </Grid>
        </DataTemplate>
    Le problème se situe sur la commande du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button x:Name="btnPersonnageFaction" Command="{Binding DataContext.SelectFactionCommand, RelativeSource={RelativeSource AncestorType=vm:MainViewModel}}" Grid.Column="1" BorderThickness="0" Background="Transparent" />
    Dans mon MainViewModel j'ai la commande suivante :
    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
     
            #region Command
            private ICommand selectFactionCommand;
            public ICommand SelectFactionCommand
            {
                get
                {
                    if (selectFactionCommand == null)
                    {
                        selectFactionCommand = new RelayCommand(
                            param => this.SelectFaction(),
                            param => this.CanSelectFaction()
                        );
                    }
                    return selectFactionCommand;
                }
            }
            private bool CanSelectFaction()
            {
                return true;
            }
            private void SelectFaction()
            {
                //ToDo
            }
            #endregion
    Avec une liaison entre MainView et MainViewModel dans le constructeur MainView()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static MainViewModel vm;
     
                vm = new MainViewModel();
                DataContext = vm;
    J'ai mis un point d'arrêt sur //ToDo mais je n'atteint jamais cette partie du code lorsque je déroule le Combobox puis clic sur le bouton qui contient la commande bindé.

    Merci pour votre aide à ce propos

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Points : 141
    Points
    141
    Par défaut
    OMG ! J'aurai dû y penser plus tôt, j'ai posé la question sur ChatGPT, il m'a donné la solution et ça fonctionne très bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Command="{Binding DataContext.SelectFactionCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
    Problème résolu !
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2022, 09h32
  2. [XL-2016] Copie spéciale depuis Excel vers Outlook d'un tableau vers une image ne fonctionne pas
    Par Heodrene dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/10/2018, 01h25
  3. Réponses: 11
    Dernier message: 20/03/2018, 16h05
  4. Redirection vers sous domaine ne fonctionne pas
    Par student_php dans le forum Apache
    Réponses: 4
    Dernier message: 17/04/2012, 09h54
  5. [PHP 5.2] Redirection vers blank qui ne fonctionne pas
    Par beegees dans le forum Langage
    Réponses: 5
    Dernier message: 01/03/2009, 12h11

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