Intereting Posts
Обновление с помощью AddToSet, не обновляющее значение null с помощью MongoDB C # Открытие IE через WCF Silverlight, веб-приложение Wpf (xbap) или нажмите один раз? Плюсы и минусы Как создавать и применять редакции? Как сохранить перечисление в базе данных как строку Возвращать данные XML из веб-службы C # Сравнение времени между двумя временными интервалами В C # можно ли открыть URL-адрес в фоновом режиме, не открывая браузер? Знать, когда в режиме разработки Операции с файлами Excel с использованием взаимодействия в многопоточном приложении C # не выполняются Изменить обои Windows с помощью .NET 4.0? Метод расширения EF: «Эта функция может быть вызвана только из LINQ в Entities». Чтение текста (данных) в изображениях с использованием c # Как использовать разные CSV для каждого основного агента для Visual Studio Cloud Testing? Запрос POST от Angular 2 до ASP.net Core не работает. Значение Null на стороне сервера

DependencyProperty типа «Binding» не обновляется

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

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

 

И в моем «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 должен делать сам.

Спасибо

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

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

Другие свойства одного и того же classа очень хорошие, такие как видимость, заголовок и т. Д.

В DataGridBoundColumn свойство Binding объявляется ниже с очень грубым объяснением того же …

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

  ///  /// 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); } } } 

Хотя решение @ 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); }