Свойство DependencyProperty типа «Binding» не обновляется - PullRequest
4 голосов
/ 05 октября 2011

У меня проблемы с созданием свойства DependencyProperty типа "Binding".Другие типы работают нормально, и они успешно разрешаются, если я заполняю их, используя привязку

В моем сценарии я хочу получить необработанную привязку, чтобы я мог использовать ее для привязки к свойствам дочерних объектов почти так же, как DataGrid делает столбцы - т.е. для каждой привязки, указанной в столбце,он связывается с каждым из элементов в коллекции ItemsSource, а не с самим DataContext.

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

И в моем "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); }
    }

Обратный вызов никогда не вызывается, и свойство никогда не устанавливается.Я пробовал все виды перестановок, с обратными вызовами, без.Единственная вещь, которая дала мне какой-либо успех, состояла в том, что я заменил привязку строкой (например, UriBinding = "hello") - в этом случае он вызовет обратный вызов и установит свойство, но, конечно, потерпит неудачу, потому что этоневерный тип.

Что я делаю не так?Я видел множество примеров этого, и я думаю, именно это DataGrid должен делать сам.

Спасибо

Ответы [ 2 ]

8 голосов
/ 05 октября 2011

Любопытно, что только в другом известном мне месте свойство типа Binding имеет класс DataGridBoundColumn, который наследуется в DataGridTextColumn, DataGridCheckBoxColumn и т. Д.

И что интересно, это свойство НЕсвойство зависимости.Это простое свойство типа CLR.Я полагаю, что инфраструктура привязки основана на ограничении, которое нельзя связать с типом привязки DP.

Другие свойства этого же класса очень хороши для DP, таких как Visibility, Header и т. Д.

In DataGridBoundColumn свойство Binding объявлено, как показано ниже, с очень грубым объяснением того же самого ...

Это не DP, потому что, если бы оно получало значение, оценивалась привязка.

    /// <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);
            }
        }
    }
3 голосов
/ 02 июня 2013

Хотя решение @ WPF-it работает, оно не подходит для прикрепленных свойств, поскольку вы не можете прикрепить свойства CLR. Чтобы решить эту проблему, вы можете определить присоединенное свойство как обычно и получить объект привязки, вызвав 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...