Привязка предоставляет допустимое значение. DependencyProperty получает NULL. Почему? ⇐ C#
Привязка предоставляет допустимое значение. DependencyProperty получает NULL. Почему?
У меня есть привязка, которая меня ставит в тупик. Значение, переданное моему элементу управления, согласно преобразователю значений, действительно и не равно нулю. Но DependencyProperty в конце всегда получает нулевое значение. Тем не менее, я не получаю никаких обязательных предупреждений, ошибок или исключений в окне вывода. (У меня включено ведение журнала WPF)
Я не знаю способа увидеть, что я передаю элементу управления на более позднем этапе, кроме этапа IValueConverter. Не знаю, куда идти дальше.
Ниже приведен DependencyProperty (Сам класс сокращен, чтобы отображать только соответствующие свойства, поскольку он огромен. Я просто хочу понять проблему с этой привязкой. Все остальные свойства привязываются идеально)
публичный класс LineControl: Control { статический LineControl() { DefaultStyleKeyProperty.OverrideMetadata( typeof(LineControl), ew FrameworkPropertyMetadata(typeof(LineControl))); } общественный LineControl() { } общедоступный статический только для чтения DependencyProperty RegionsProperty = DependencyProperty.Register( nameof(Регионы), typeof(IEnumerable), typeof(LineControl), new FrameworkPropertyMetadata(Enumerable.Empty(), OnRegionsChanged)); общедоступные регионы IEnumerable { get => (IEnumerable)GetValue(RegionsProperty); set => SetValue(RegionsProperty, value); } Private static void OnRegionsChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { // Санитарная проверка. Здесь я продолжаю получать NULL для нового значения. if (e.NewValue не IEnumerable) Debug.WriteLine("НУЛЕВЫЕ РЕГИОНЫ"); // Я получаю только это еще Debug.WriteLine("ДЕЙСТВИТЕЛЬНЫЕ РЕГИОНЫ"); // Не это. } } Модель представления LineShape — это довольно простой класс со свойствами для рисования линии. Сокращенная версия
публичный класс LineShape: ObservableObject { частная точка _p1; частная точка _p2; частный только для чтения ObservableCollection _regions = new(); public IEnumerable Regions => _regions; общественная точка P1 {get => _p1; set => SetProperty(ref _p1, value); } общественная точка P2 {get => _p2; set => SetProperty(ref _p2, value); } } Вот как я это связываю
Как я уже упоминал, чтобы попытаться диагностировать это, я попытался вставить в привязку ничего не делающий IValueConverter. Он регистрирует тип предоставленного объекта, а затем возвращает заданное значение без изменений. Вот так
публичный класс LogValueConverter: MarkupExtension, IValueConverter { общедоступный объект переопределения ProvideValue (IServiceProvider serviceProvider) => this; общедоступный объект Convert (объект? v, Type tt, объект p, CultureInfo c) { Debug.WriteLine($"Type = {(v?.GetType() ?? "NULL")}"); вернуть v; } общественный объект? ConvertBack(object? v, Type tt, object? p, CultureInfo c) => return v; } а затем я отредактировал свой DataTemplate вот так
Regions="{Области привязки, Converter={core:LogValueConverter}}" Но каждый раз этот преобразователь регистрирует в окне вывода, что я предоставляю действительный объект типа ObservableCollection для привязки.
Type=System.Collections.ObjectModel.ObservableCollection`1[Core.Shapes.ShapeRegion] Однако каждый раз мой следующий оператор журнала (в обратном вызове с измененным свойством для LineControl.Regions) сообщает мне, что элемент управления получил нулевое значение. Я также проверил оба варианта с помощью точек останова в отладчике. Должно быть, я упускаю что-то совершенно очевидное, но понятия не имею, что именно. Есть идеи, что не так?
Добавление редактирования: я не могу воспроизвести эту проблему в простом примере. И это именно моя проблема: в прошлом я делал сотни подобных привязок без проблем. Но этот, в частности, демонстрирует поведение, которое я не могу понять. Я надеюсь, что кто-нибудь узнает способ лучше диагностировать причину сбоя одиночной привязки. Или предложение о том, что может быть причиной этого, что могло бы помочь мне в дальнейшем расследовании. Потому что сейчас у меня нет ходов.
У меня есть привязка, которая меня ставит в тупик. Значение, переданное моему элементу управления, согласно преобразователю значений, действительно и не равно нулю. Но DependencyProperty в конце всегда получает нулевое значение. Тем не менее, я не получаю никаких обязательных предупреждений, ошибок или исключений в окне вывода. (У меня включено ведение журнала WPF)
Я не знаю способа увидеть, что я передаю элементу управления на более позднем этапе, кроме этапа IValueConverter. Не знаю, куда идти дальше.
Ниже приведен DependencyProperty (Сам класс сокращен, чтобы отображать только соответствующие свойства, поскольку он огромен. Я просто хочу понять проблему с этой привязкой. Все остальные свойства привязываются идеально)
публичный класс LineControl: Control { статический LineControl() { DefaultStyleKeyProperty.OverrideMetadata( typeof(LineControl), ew FrameworkPropertyMetadata(typeof(LineControl))); } общественный LineControl() { } общедоступный статический только для чтения DependencyProperty RegionsProperty = DependencyProperty.Register( nameof(Регионы), typeof(IEnumerable), typeof(LineControl), new FrameworkPropertyMetadata(Enumerable.Empty(), OnRegionsChanged)); общедоступные регионы IEnumerable { get => (IEnumerable)GetValue(RegionsProperty); set => SetValue(RegionsProperty, value); } Private static void OnRegionsChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { // Санитарная проверка. Здесь я продолжаю получать NULL для нового значения. if (e.NewValue не IEnumerable) Debug.WriteLine("НУЛЕВЫЕ РЕГИОНЫ"); // Я получаю только это еще Debug.WriteLine("ДЕЙСТВИТЕЛЬНЫЕ РЕГИОНЫ"); // Не это. } } Модель представления LineShape — это довольно простой класс со свойствами для рисования линии. Сокращенная версия
публичный класс LineShape: ObservableObject { частная точка _p1; частная точка _p2; частный только для чтения ObservableCollection _regions = new(); public IEnumerable Regions => _regions; общественная точка P1 {get => _p1; set => SetProperty(ref _p1, value); } общественная точка P2 {get => _p2; set => SetProperty(ref _p2, value); } } Вот как я это связываю
Как я уже упоминал, чтобы попытаться диагностировать это, я попытался вставить в привязку ничего не делающий IValueConverter. Он регистрирует тип предоставленного объекта, а затем возвращает заданное значение без изменений. Вот так
публичный класс LogValueConverter: MarkupExtension, IValueConverter { общедоступный объект переопределения ProvideValue (IServiceProvider serviceProvider) => this; общедоступный объект Convert (объект? v, Type tt, объект p, CultureInfo c) { Debug.WriteLine($"Type = {(v?.GetType() ?? "NULL")}"); вернуть v; } общественный объект? ConvertBack(object? v, Type tt, object? p, CultureInfo c) => return v; } а затем я отредактировал свой DataTemplate вот так
Regions="{Области привязки, Converter={core:LogValueConverter}}" Но каждый раз этот преобразователь регистрирует в окне вывода, что я предоставляю действительный объект типа ObservableCollection для привязки.
Type=System.Collections.ObjectModel.ObservableCollection`1[Core.Shapes.ShapeRegion] Однако каждый раз мой следующий оператор журнала (в обратном вызове с измененным свойством для LineControl.Regions) сообщает мне, что элемент управления получил нулевое значение. Я также проверил оба варианта с помощью точек останова в отладчике. Должно быть, я упускаю что-то совершенно очевидное, но понятия не имею, что именно. Есть идеи, что не так?
Добавление редактирования: я не могу воспроизвести эту проблему в простом примере. И это именно моя проблема: в прошлом я делал сотни подобных привязок без проблем. Но этот, в частности, демонстрирует поведение, которое я не могу понять. Я надеюсь, что кто-нибудь узнает способ лучше диагностировать причину сбоя одиночной привязки. Или предложение о том, что может быть причиной этого, что могло бы помочь мне в дальнейшем расследовании. Потому что сейчас у меня нет ходов.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение