Прикрепленное свойство: Проверить привязку

Короткий вопрос

Есть ли быстрый способ узнать, с чем связано конкретное присоединенное свойство, во время выполнения?

Деталь

Я отлаживаю UserControl (наследующий ItemsControl), который связывает Canvas.Left и Canvas.Top своих элементов с двумя свойствами объектов ViewModel через стиль. Во время выполнения я помещаю точку останова в определенное место и хочу проверить привязку Canvas.Left присоединенного свойства.

Обратите внимание, что я не хочу видеть текущее значение присоединенного свойства для элемента. Я легко могу это сделать, проверив значение Canvas.GetLeft(myItem) в окнах QuickWatch или Immediate. Я хочу проверить здесь фактическую привязку, то есть имя свойства виртуальной машины, к которому привязано это свойство для myItem.

Я уже пробовал Snoop, который, к сожалению, не показывает привязки прикрепленных свойств (если я не пропустил что-то очевидное).


person dotNET    schedule 06.08.2015    source источник
comment
Output окно покажет вам любые ошибки привязки. Отсутствие ошибок может означать, что привязка (если она действительно есть) была успешной. Присоединенное свойство имеет обратный вызов при изменении значения, вы можете использовать его для отладки привязки присоединенного свойства.   -  person Sinatr    schedule 06.08.2015
comment
stackoverflow.com/a/2788583/5095281 эта ссылка может помочь   -  person NeverAgain    schedule 06.08.2015
comment
@NeverAgain: В этом посте не говорится о прикрепленных свойствах.   -  person dotNET    schedule 06.08.2015
comment
@Sinatr: Я не вижу ошибок привязки в окне вывода. Кроме того, значение присоединенного свойства не меняется, поэтому прослушивание обратного вызова не поможет.   -  person dotNET    schedule 06.08.2015
comment
Событие возникает хотя бы один раз после загрузки baml (например, если вы написали в xaml Canvas.Top="0", вы его получите, если вы не напишете, тогда оно, очевидно, будет иметь значение по умолчанию), вы можете переопределить свойство, см. здесь, затем установите обратный вызов и посмотреть, что было установлено для данного элемента (sender будет DependencyProperty, для которого вы установили значение присоединенного свойства).   -  person Sinatr    schedule 06.08.2015


Ответы (2)


Есть ли быстрый способ узнать, к чему привязано конкретное присоединенное свойство, во время выполнения

Да, просто переопределить прикрепленное свойство где-нибудь (в вашем окне?):

<Window x:Class="WpfApplication1.MainWindow" ... >
    <Grid Canvas.Top="123"/>
</Window>

и код

public MainWindow()
{
    InitializeComponent();
    Canvas.TopProperty.OverrideMetadata(typeof(MainWindow), new FrameworkPropertyMetadata((d, e) =>
    {
        // you will get here for each Canvas.Top set in MainWindow
        MessageBox.Show(d.ToString());
    }));
}
person Sinatr    schedule 06.08.2015

Вы можете получить привязку присоединенного свойства программно так же, как и обычную привязку свойства зависимости. Т.е. из кода позади, чтобы получить Canvas.LeftProperty привязку присоединенного свойства элемента управления с именем myItemsControl:

BindingExpression bindingExpression = myItemsControl.GetBindingExpression(Canvas.LeftProperty);
Binding parentBinding = bindingExpression.ParentBinding;
person BalintPogatsa    schedule 27.11.2016