У меня есть проект, который бросает некоторые ошибки привязки данных. Например:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
Мой вопрос заключается в том, есть ли способ определить, где это обязательство фактически объявлено (либо оно объявлено в XAML, либо в коде).
Что я пробовал до сих пор:
- добавлена трассировка отладки для пространства имен System.Windows.Data с набором уровней o All; это не принесло никакой полезной информации.
- попытался выполнить текстовый поиск в проекте для слова Binding в надежде найти все выражения привязки, у которых Path установлен на
HorizontalContentAlignment
; Я нашел только один и удалил его, но я все еще получаю сообщение, которое, похоже, указывает, что это не ошибка.
Знаете ли вы о каких-либо других трюках, чтобы сделать WPF еще более полезной информацией о том, где именно объявлено это обязательство?
ОБНОВЛЕНИЕ
После немного большего поиска я уверен, что это как-то вызвано стилем, применяемым к MenuItem
. Тем не менее, я все еще не могу указать местоположение, в котором объявляется ошибочная привязка.
ОБНОВЛЕНИЕ 2
Я нашел проблему. Однако этот вопрос по-прежнему сохраняется, поскольку обнаружение проблемы в основном связано с поиском в темноте на основе ограниченной информации в сообщении об ошибке.
Как оказалось, привязка объявляется в стиле. И стиль не в моем приложении. Это, вероятно, стиль по умолчанию для MenuItem
. Поэтому, чтобы исправить проблему, я только вручную установил HorizontalContentAlignment
на всех MenuItems
. Причина ошибки связана с порядком операций, так как этот MenuItem
генерируется в коде. Я отдельно опубликую новый вопрос.
Итак, на данный момент мораль этой истории заключается в том, что я считаю, что должен быть лучший механизм для определения того, где объявлено ошибочное обязательство. Я бы хотел увидеть что-то вроде трассировки стека для привязок.
Я оставляю вопрос открытым на некоторое время дольше, если кто-нибудь знает о каких-либо других инструментах или методах определения места, где привязка объявляется в коде или разметке.
Я разместил еще один вопрос о том, как стиль/привязка применяется к MenuItems
здесь.