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.

Échoue comment, et à quel point êtes-vous de la création de l'objet usercontrol? A la grille présentée?
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