WPF Liaison à la Largeur de Colonne de Grille
Je suis d'essayer de lier un DependancyProperty
dans un de mes usercontrols à la Width
propriété d'un Column
dans un Grid
.
J'ai un code similaire à ceci:
<Grid x:Name="MyGridName">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="TitleSection" Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>
Dans un autre Usercontrol j'ai le texte suivantDependancyProperty
défini.
public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));
public int TitleWidth
{
get { return (int)base.GetValue(TitleWidthProperty); }
set { base.SetValue(TitleWidthProperty, value); }
}
Je suis de la création d'instances de l'objet Usercontrol dans le code, donc j'ai un engagement similaire à ceci :
MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */
La première liaison définie fonctionne incroyablement, même si c'est contraignant pour une réelle UIElement (dans ce cas, un Curseur), mais la Liaison "TitleSection" (qui est la ColumnDefinition définis dans la Grille) échoue. Mettant un point d'arrêt dans le code et de faire une veille sur "TitleSection" renvoie l'objet attendu.
Je commence à soupçonner qu'un x:Name avais ColumnDefinition ne peut pas être lié à. Quelqu'un peut-il suggérer comment je pourrais être capable de se lier à la modification de la largeur de la première colonne dans mon réseau?
EDIT #1 - pour répondre À des commentaires
La liaison de données échoue dans le sens que, avec un point d'arrêt situé sur la définition pour la TitleWidth
de la propriété, et à l'aide de la GridSplitter de contrôle pour redimensionner la première colonne, le point d'arrêt n'est jamais atteint. En outre, le code je m'attends à être déclenché lorsque la DependancyProperty TitleWidth
changements ne soit pas exécutée.
Le contrôle utilisateur est créé et ajouté à un Stackpanel au sein de la Grille dans le Window_Loaded
fonction. Je m'attends à ce que la Grille a été rendue par le temps, les contrôles utilisateur sont en cours de construction. Certainement le x:Name avais Élément TitleSection
est regardable et a une valeur de 100
quand ils sont en cours de construction /avant que la liaison qui se passe.
EDIT #2 - peut-être quelque chose à voir avec cela?
J'ai eu sniff tour de la MSDN pages pour la Grille ColumnDefinition de documentation et d'avoir rencontré GridLength() mais je ne peux pas obtenir ma tête autour de la façon dont je peux l'utiliser dans une expression de liaison. Je ne peux pas utiliser les associés GridLengthConverter comme un convertisseur dans le code de liaison qu'elle ne découle pas de IValueConverter.
Je me penche vers en quelque sorte la liaison à la ActualWidth propriété de l'une des cellules de la Grille de l'objet. Il ne semble pas aussi propre que la liaison à la définition de la colonne, mais pour le moment je ne peut pas obtenir que cela fonctionne.
Vous ne pouvez pas compter sur la définition de points d'arrêt dans le set/get est une dépendance au bien, comme ils ne seront jamais utilisées par le moteur de liaison. En interne, des dépendances de la propriété sont définies à l'aide de SetValue(DependencyProperty, valeur)
OriginalL'auteur Ash | 2008-11-12
Vous devez vous connecter pour publier un commentaire.
Eh bien, j'ai eu un peu d'une bidouille de travail, je vais vous expliquer comment faire pour les générations futures:
Essentiellement, j'ai une colonne 2, ligne multi grille avec un coupleur aligné à droite dans la première colonne, de sorte qu'il peut être redimensionnée par l'utilisateur si le contenu qu'il contient nécessite plus d'espace. Pour compliquer les choses, j'ai un contrôle de l'utilisateur en cours de chargement par programmation dans certaines des lignes qui a un columnSpan de 2 à des fins de rendu (contenu 'fondu' partir d'une cellule à la suivante).
Lors de la première colonne est redimensionnée en ai besoin pour être reflétée dans le usercontrol. Tout d'abord j'ai essayé de liaison à la ColumnDefinition mais ce n'était vraiment pas jouer à la balle.
Comment je fixe/Kludged il
Dans une cellule de rechange dans la première colonne, j'ai ajouté un
<Label>
avec un x:Nom de la rendre accessible. Comme il est dans une cellule, il a les propriétés par défaut de "d'allonger" la et remplit la cellule complètement. Il est redimensionnée que la colonne est redimensionnée à l'aide du coupleur. La liaison à l'Étiquette duActualWidth
propriété signifie que les modifications de la taille de la colonne sont communiquées à la DependancyProperty dans mon columnSpanned usercontrol correctement.Pensées
Évidemment, malgré ColumnDefinition avoir un
ActualWidth
de la propriété en cas de changement, il n'apparaît pas le feu à laPropertyChanged
événement en interne (ou c'est ma meilleure supposition). Cela peut être un bug, ou par la conception, mais pour moi ça veut dire que j'ai eu à utiliser un moins propre solution.OriginalL'auteur Ash
Avez-vous essayé la configuration de la liaison dans le code xaml, les éléments suivants doivent travailler pour vous.
Sinon, en regardant le code de liaison que vous avez fourni, il ressemble le mauvais sens tout autour de moi, la cible de la liaison doivent être de la colonne de grille et la source doit être votre propriété de dépendance.
L'équivalent de code ci-dessus par le xaml est
Sur une note connexe, à l'aide d'un GridSplitter et de liaison de la Largeur de la propriété sont mutally exclusif. Dès que vous redimensionner la colonne en utilisant le séparateur, votre liaison sera remplacé par la valeur du diviseur.
Ceci est similaire à ce que vous l'expérience en mettant à jour tout le bien qui est la cible d'une liaison. Lorsque vous définissez les objectifs de valeur directement dans le code, vous êtes esentially remplacement de l'objet de liaison avec la valeur que vous fournissez.
OriginalL'auteur Ian Oakes
ColumnDefinition.La largeur n'est pas un entier, il est un GridLength.
Vous ne pouvez pas lier le GridLength directement à l'Entier, vous avez besoin d'un convertisseur.
C'est aussi la raison pour laquelle vous ne pouvez pas lier n'importe quel Contrôle de la Largeur de la propriété (double) pour un ColumnDefinition Width propriété (GridLength) sans convertisseur.
OriginalL'auteur JCH2k