DependencyProperty de type “Binding” n’est pas en cours de mise à jour

Je ne parviens pas à créer un DependencyProperty de type “Binding”. D’autres types fonctionnent correctement et ils sont résolus avec succès si je les remplis à l’aide d’une liaison.

Dans mon scénario, je souhaite récupérer la liaison brute afin de pouvoir l’utiliser pour la liaison avec les propriétés des objects enfants, de la même manière que DataGrid crée des colonnes. En d’autres termes, pour chaque liaison spécifiée dans une colonne, elle est liée à chacun des éléments de la collection ItemsSource, plutôt que de lier le DataContext lui-même.

 

Et dans mon “MultiSelectDataGrid”:

  public static readonly DependencyProperty UriBindingProperty = DependencyProperty.Register("UriBinding", typeof(BindingBase), typeof(MultiSelectDataGrid), new PropertyMetadata { PropertyChangedCallback = OnBindingChanged}); private static void OnBindingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // This is never enterred } public BindingBase UriBinding { get { return (BindingBase)GetValue(UriBindingProperty); } set { SetValue(UriBindingProperty, value); } } 

Le rappel n’est jamais appelé et la propriété n’est jamais définie. J’ai essayé toutes sortes de permutations, avec des rappels, sans. Si je remplaçais la liaison par une chaîne (par exemple, UriBinding = “hello”), tout ce qui me donnait du succès – dans ce cas, le rappel serait déclenché et la propriété définie, mais bien sûr, elle échouerait mauvais type.

Qu’est-ce que je fais mal? J’ai vu une foule d’exemples de cela, et j’imagine que c’est ce que DataGrid doit faire lui-même.

Merci

C’est curieusement le seul autre endroit que je connaisse qui ait la propriété de type Binding est la classe DataGridBoundColumn qui dérive dans DataGridTextColumn , DataGridCheckBoxColumn etc.

Et il est intéressant de noter que la propriété n’est PAS une propriété de dépendance. C’est une propriété de type CLR simple. Je suppose que l’infrastructure de liaison est basée sur la limitation que vous ne pouvez pas lier à une liaison de type DP.

Les autres propriétés de la même classe sont très bien les DP comme Visibility, Header etc.

Dans DataGridBoundColumn la propriété Binding est déclarée comme suit avec une explication très grossière pour le même …

Ce n’est pas un DP car s’il obtenait la valeur, la liaison serait évaluée.

  ///  /// The binding that will be applied to the generated element. ///  ///  /// This isn't a DP because if it were getting the value would evaluate the binding. ///  public virtual BindingBase Binding { get { if (!_bindingEnsured) { if (!IsReadOnly) { DataGridHelper.EnsureTwoWayIfNotOneWay(_binding); } _bindingEnsured = true; } return _binding; } set { if (_binding != value) { BindingBase oldBinding = _binding; _binding = value; CoerceValue(IsReadOnlyProperty); CoerceValue(SortMemberPathProperty); _bindingEnsured = false; OnBindingChanged(oldBinding, _binding); } } } 

Bien que la solution @ WPF-it fonctionne, elle ne convient pas aux propriétés attachées, car vous ne pouvez pas attacher de propriétés CLR. Pour résoudre ce problème, vous pouvez définir votre propriété attachée comme d’habitude et obtenir l’object de liaison en appelant BindingOperations.GetBindingBase() .

 private static void OnMyPropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // Can also use GetBinding(), GetBindingExpression() // GetBindingExpressionBase() as needed. var binding = BindingOperations.GetBindingBase(d, e.Property); }