Question

Je travaille actuellement dans un contrôle utilisateur WPF (l'élément racine de mon fichier XAML est "UserControl"), qui, je le sais, est hébergé dans une fenêtre. Comment accéder à une propriété de la fenêtre en utilisant la liaison de données?

Est-ce que quelqu'un sait pourquoi simplement

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." />

ne fonctionne pas? Le message d'erreur que je reçois est le suivant:

System.Windows.Data Avertissement: 4: Impossible de trouver la source pour la liaison avec la référence 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''.

Modifier: J'ai utilisé une variante de l'approche d'ArsenMkrt. J'ai donc accepté sa réponse. Cependant, je suis toujours intéressé à savoir pourquoi FindAncestor ne "fonctionne pas".

Était-ce utile?

La solution

Le meilleur moyen est de donner un nom à UserControl

Créez la propriété de dépendance MyProperty dans UserControl avec une liaison bidirectionnelle et liez-la dans la fenêtre principale, puis liez-la dans UserControl comme ceci

<UserControl x:Name = "myControl">
     <Label Content={Binding ElementName= myControl, Path=MyProperty}/>
</UserControl>

Autres conseils

Si vous essayez d'échapper à un ItemsControl ou à un DataGridView pour accéder à une fenêtre , il se peut que vous trouviez cet ancestorType de La fenêtre type: ne fonctionne pas. Ou du moins ne semble pas…

Si tel est le cas, vous utilisez probablement Blend ou Visual Studio et attendez-vous à ce que les données soient visibles au moment de la conception, ce qui ne sera pas le cas car VS + Blend crée ses propres instances qui ne sont pas vraiment Windows. Cela fonctionnera très bien lors de l'exécution, mais pas en mode conception.

Il y a quelques choses que vous pouvez faire:

  • Insérer un contrôle utilisateur

  • Voici une solution alternative que j'ai proposée. Cela présente un avantage en ce sens que vous ne faites pas directement référence à un UserControl ou à une Fenêtre . Ainsi, si vous modifiez le conteneur parent, votre code ne sera pas interrompu.

    <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:views="clr-namespace:MyWPFApplication.Views"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                  
    x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow"
    mc:Ignorable="d"
    x:Name="LayoutRoot"
    Title="UPCLabelPrinterWindow">
    
    <views:DataContextWrapper>
        <DockPanel>
            ...
        </DockPanel>
    </views:DataContextWrapper>
    

DataContextWrapper est simplement une grille

namespace MyWPFApplication.Views {
   public class DataContextWrapper : Grid
   {

   }
}

Ensuite, lorsque vous vous liez, faites ceci:

<TextBlock Text="{Binding="{Binding DataContext.SomeText, 
  RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper}, 
  Mode=FindAncestor}}" />

Remarque: si vous voulez lier une propriété à ON Window, c'est plus compliqué et vous devriez probablement lier via une propriété de dépendance ou quelque chose comme ça. Mais si vous utilisez MVVM, voici une solution que j'ai trouvée.

Je pense que vous devriez configurer le mode SET = " OneWayToSource " Comme ceci:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top