Это зависит на самом деле, и, как H.B. указывает, но это будет очень интенсивно, даже в «легких» случаях.
В вашем примере, предполагая, что вы можете получить привязки, вы можете проверить свойство Path и посмотреть, ссылается ли оно на ваше свойство "Foo". Но есть случаи, когда это не будет работать. Привязка вроде {Binding Path=DataContext.Foo}
например. Путь может быть намного сложнее, чем отдельные имена свойств.
Кроме того, DataContext может меняться в зависимости от того, где вы находитесь. Элементы, определенные в DataTemplate, не наследуют родительский контекст данных по умолчанию. Так что, если у вас было:
<UserControl>
<ContextControl Content="Test">
<ContextControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Foo, Mode=TwoWay}"/>
</DataTemplate>
</ContextControl.ContentTemplate>
</ContextControl>
</UserControl>
Тогда свойство Foo
ссылается на строку "Test"
, а не на ваш объект. Также существует случай, когда свойства Source, ElementName и RelativeSource используются в привязке.
Предполагая, что у вас есть только один DataContext и вы используете только пути из одного слова, вы, вероятно, сможете найти большинство, если не все цели.
Во-первых, вам нужно перебрать каждый элемент в визуальном и логическом деревьях VisualTreeHelper , чтобы пройти по визуальному дереву. Логическое дерево будет хитрым.
Для каждого элемента вам придется перебирать каждое определенное свойство зависимости. Для этого вам нужно использовать отражение в открытых статических полях типа DependencyProperty.
Далее, для каждого свойства зависимости вам нужно будет вызвать GetBindingExpression , чтобы получить связанное BindingExpression . Затем вы можете получить родительскую привязку, используя свойство ParentBinding .
Тогда просто сравнить свойство пути.