2009-12-04 4 views
0

J'ai un modèle dans ma section. Je veux lier la largeur de l'une des valeurs de ce modèle à la largeur d'un contrôle dans ma section XAML principale.Liaison de données WPF - Lier au contrôle d'interface utilisateur à partir d'un modèle

Est-ce que cela peut être fait? Expression Blend affiche uniquement le modèle dans la liste de liaison.

Par exemple, voici ce que je suis désireux d'avoir un travail:

<Windows.Resources> 
... My template stuff 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="20" /> 
     <ColumnDefinition Width="50" /> 
     <ColumnDefinition Width="{Binding ElementName=SecondColumn, Path=Width}"/> 
     <ColumnDefinition Width="30" /> 
    </Grid.ColumnDefinitions> 
... More template stuff 
</Windwos.Resources> 

<Grid Name="MainGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Name="FirstColumn" Width=".25*" /> 
     <ColumnDefinition Name="SecondColumn" Width=".5*" /> 
     <ColumnDefinition Name="ThirdColumn" Width=".25*" /> 
    </Grid.ColumnDefinitions> 
... Rest of my XAML 

Répondre

1

Une fois à l'intérieur du modèle, vous êtes en quelque sorte isolé des autres éléments (avec raison - il peut être réutilisé ailleurs). Dans ce cas (en supposant que le modèle est utilisé quelque part sous "MainGrid") il semble que vous puissiez utiliser une RelativeSource FindAncestor Binding pour localiser la Grid parent (vous devez vous assurer de compter les Grids dans le VisualTree pour obtenir le bon AncestorLevel - en seulement le code ici ce serait 2). Le chemin serait ColumnDefinitions [1] .Width. Gardez à l'esprit que cela dépend de vous maintenir la structure des éléments où vous utilisez le modèle de sorte qu'il est un peu fragile. Il existe également une autre méthode utilisant SharedSizeGroup qui peut connecter des lignes de grille ou des colonnes à différents niveaux, mais qui ne fonctionne qu'avec des tailles de pixels automatiques et fixes. Cette méthode de liaison fonctionne avec les tailles fixes et *.

entière Reliure:

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[1].Width}" 
1

Voulez-vous dire que vous voulez que vos colonnes à toujours la même largeur ou voulez-vous dire que dans un premier temps, ils sont à même largeur? Si oui, pourquoi ne pas définir un style et l'utiliser dans les deux colonnes?

Questions connexes