Как я могу найти все целевые свойства зависимости, привязанные к свойству? - PullRequest
3 голосов
/ 14 июня 2011

Например:

<UserControl>
    <TextBox Text="{Binding Path=Foo, Mode=TwoWays}"/>
    <TextBlock Text="{Binding Path=Foo}"/>
</UserControl>

В коде можно ли найти список свойств зависимостей, которые используют свойство Foo в качестве источника?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Это зависит на самом деле, и, как 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 .

Тогда просто сравнить свойство пути.

1 голос
/ 15 июня 2011

Да, и для всех, что я знаю, вам нужно использовать отражение, и это также не очень хорошая идея с точки зрения производительности.

...