DependencyProperty of type “Binding” is not being updated

流过昼夜 提交于 2020-01-01 12:08:49

问题


I'm having trouble creating a DependencyProperty of type "Binding". Other types work ok, and they resolve successfully if I populate them using a binding.

In my scenario I want to grab the raw binding, so that I can use it to bind to properties of child objects, in much the same way that DataGrid does columns - ie for each binding specified in a column, it binds to each of the items in the ItemsSource collection, rather than binding the the DataContext itself.

<mg:MultiSelectDataGrid x:Name="Grid" DockPanel.Dock="Left" 
     ItemsSource="{Binding Path=Rows}" DataContext="{Binding}" 
     AutoGenerateColumns="False" UriBinding="{Binding Path=UrlItems}">

And in my "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); }
    }

The callback never gets called, and the property never gets set. I've tried all kinds of permutations, with callbacks, without. The only thing that gave me any success was if I replaced the binding with a string (eg UriBinding="hello") - in that case it would fire the callback, and set the property, but would, of course, fail because it's the wrong type.

What am I doing wrong? I've seen a whole load of examples of this, and I guess this is what DataGrid must be doing itself.

Thanks


回答1:


Curiously only other place I am aware of that has Binding type property is DataGridBoundColumn class which derives into DataGridTextColumn, DataGridCheckBoxColumn etc...

And interestingly there the property is NOT a dependency property. It is a plain CLR type property. I guess the infrastructre of binding is based upon the limitation that you cannot bind to binding type DP.

Other properties of the same class are very well DPs like Visibility, Header etc.

In DataGridBoundColumn the Binding property is declared as below with a very crude explanation for the same ...

This isn't a DP because if it were getting the value would evaluate the binding.

    /// <summary>
    ///     The binding that will be applied to the generated element.
    /// </summary>
    /// <remarks>
    ///     This isn't a DP because if it were getting the value would evaluate the binding.
    /// </remarks>
    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);
            }
        }
    }



回答2:


While @WPF-it solution works, it's unsuitable for attached properties, since you can't attach CLR properties. To solve this you can define your attached property as usual, and get the binding object by calling 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);
}


来源:https://stackoverflow.com/questions/7666181/dependencyproperty-of-type-binding-is-not-being-updated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!