2010-05-05 3 views
0

У меня есть объект XAML называется ChromeWindow (производный от Window), который имеет в его код-за DependencyProperty называется AppChrome, которая хранит ссылку на связанный объект ApplicationChrome XAML (производный от UserControl) , Файл XAML ApplicationChrome имеет несколько объектов x:Name '(например, TextBlock и Border), к которым я хочу привязываться с XAML ChromeWindow. Корень ChromeWindow является x:Name «d, как rootWindow в XAML, так что я понял, один из этих привязок будет работать:XAML Multi-Level Binding Source/Path Issue

{Binding ElementName=rootWindow, Path=AppChrome.CaptionTextBlock.Text, Mode=OneWay} 

Но что жалуется на ошибки BindingExpression пути таким образом, что свойство„CaptionTextBlock“(Х : Name'd TextBlock в XAML AppChrome в) не может быть найден на объект типа ApplicationChrome

Так что я попытался связывании Intead это:

{Binding Source=AppChrome.CaptionTextBlock, Path=Text, Mode=OneWay} 

и до сих пор не удача, на этот раз жалобы снова BindingExpression ошибки пути, но на этот раз, что он не может найти CaptionTextBlock собственности на объекте типа String

+0

«Решение» (и я использую этот термин очень слабо) состояло в том, чтобы просто сделать DP для каждого элемента XAML в AppChrome, к которому я хотел получить доступ через пути Binding, а в методе Loaded() для AppChrome - установить DP на соответствующий элемент по имени. Кажется, что XAML Markup должен быть более умным, чем это, и я помню, что это отлично работало .Net 3.5 SP1 – tpartee

+0

Aaaand, так много для этого решения. Связи никогда не получают уведомления об обновлениях из своих исходных свойств. Fabulous. – tpartee

+0

Это никогда бы не работало в .NET 3.5 или в любой другой версии. – Charlie

ответ

0

Даже если вы назвали эти элементы, они не будут доступны для связывания, если нет свойство зависимостей подвергаются для них.

ApplicationChrome необходимо будет предоставить свойство зависимости, называемое CaptionTextBlock, для этого привязки для работы.

Возможно, вы могли бы объяснить, почему вы пытаетесь привязать эти объекты, чтобы мы могли лучше понять ваш сценарий. Вероятно, есть лучший способ сделать это, потому что такая привязка не только беспорядочна, но и необычна.

+0

Я пытаюсь проследить их до их свойств в качестве конечного пункта назначения, а не связывать их сами. Нужно ли им быть DP для привязки к их свойствам? И если да, есть ли простой способ превратить элемент x: Name'd XAML в DP, к которому нужно получить доступ? – tpartee

+0

Да, но как WPF должен знать, что есть CaptionTextBlock на AppChrome? Все, что он знает, это то, что AppChrome - это своего рода UserControl с каким-то визуальным деревом. Внутри вашего визуального дерева вы назвали элемент, но WPF не знает, что существует. Он знает о свойствах зависимостей, выставленных на вашем классе, но это все, о чем он знает. И нет, нет простого способа сделать это. Возможно, вы могли бы описать, что вы пытаетесь выполнить через эту привязку. – Charlie

+0

WPF должен знать, что элемент существует, потому что он находится в XAML для объекта (который является одной частью определения частичного класса), а элементы x: Name'd становятся членами класса из-за этого. Если IntelliSense может понять это, тогда нет причин, по которым не следует компилятор, компилятор и компоновщик. В любом случае, это больше похоже на проблему с парсером пути расширения расширений XAML для Bindings - глядя на какой-то старый код, который я сделал для .Net 3.5 SP1, это было возможно, но в .Net 4.0 оно задыхается. – tpartee