Установить свойство зависимости datacontext

#wpf #binding

#wpf #привязка

Вопрос:

Я пытаюсь установить datacontext элемента управления, используя следующий код:

 public object GlobalContext
{
    set { this.SetValue(global.DataContext as DependencyProperty , value);  }
}
  

Где global — это элемент управления, в данном случае stackpanel.

Когда я наведу курсор на global.DataContext , он сообщает, что это свойство зависимости, поэтому я решил, что оно должно работать, но я получаю следующую ошибку:

‘Привязка’ не может быть установлена для свойства ‘GlobalContext’ типа ‘ResourceModuleAccessView’. ‘Привязка’ может быть установлена только для свойства DependencyProperty объекта DependencyObject.

Как я могу заставить это работать?

Редактировать 1: В пользовательском элементе управления у меня есть:

  <StackPanel x:Name="global" Orientation="Horizontal">
  

и в тех местах, где я пытаюсь повторно использовать элемент управления:

     <my:ResourceModuleAccessView  

        ControlName="Usage Monitoring"
        GlobalContext="{Binding Path=moduleAccess.GlobalAccess[ResourceModule.UsageMonitoring]}"          
          GroupContext="{Binding Path=moduleAccess.Items[ResourceModule.UsageMonitoring]}" />
  

Ответ №1:

Ваш класс GlobalContext должен быть унаследован от DependencyObject, если вы собираетесь использовать его в качестве цели привязки или использовать метод setValue. Кроме того, вы должны передать статическое свойство DataContext* из FrameworkElement в setValue , это фактический объект свойства dependecy, вы передаете объект datacontext дважды. Другими словами, вызов должен быть

 SetValue(FrameworkElement.DataContextProperty,value);
  

я подозреваю, что есть что-то еще неправильное, чем этот код, хотя, можете ли вы опубликовать свой xaml?

-редактировать-

Спасибо за добавление кода, поскольку вы привязываетесь к своему классу (ваш класс является целью привязки в отличие от источника привязки), вы должны сделать его DependecyObject и сделать свой GlobalContext DependecyProperty.

Также обратите внимание, что когда система привязки устанавливает свойство dependecy, она не использует обычное свойство clr, она напрямую использует объект DependencyProperty. Это означает, что если вы хотите зарегистрировать обратный вызов при изменении свойства, вы должны сделать это в вызове Register при создании DependecyProperty

Комментарии:

1. спасибо, что исправили проблему, хотя у меня все еще есть некоторые несоответствия с привязкой данных. У меня действительно были объявлены свойства зависимости, но они были закомментированы, хе-хе.

Ответ №2:

Свойство DataContext, которое определено на FrameworkElement , является свойством зависимости, то есть это свойство, которое «поддерживается» платформой свойств зависимостей WPF. Однако тип этого свойства является object . Тот факт, что это свойство зависимости, говорит вам о том, как оно хранится, а не о типе данных, хранящихся в нем.