Каков синтаксис привязки значений в xaml?
-
08-06-2019 - |
Вопрос
Я все больше узнаю о привязке в WPF.Однако у меня возникли большие проблемы с отладкой ошибок синтаксического анализа в моем xaml.Может кто-нибудь симпатичный, пожалуйста, скажите мне, что не так с этим маленьким кусочком?:
<Border Name="TrackBackground"
Margin="0"
CornerRadius="2"
Grid.Row="1"
Grid.Column="1"
Background="BlanchedAlmond"
BorderThickness="1"
Height="{TemplateBinding Height}">
<Canvas Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
<Thumb Name="ThumbKnob" Height="{Binding ElementName=Part_Track, Path=Height, Mode=OneWay}" />
</Canvas>
</Border>
Это привязка данных, которая ломается.я получаю InvalidAttributeValue
исключение для ThumbKnob.Height, когда я пытаюсь запустить это.Я знаю, что, должно быть, упускаю что-то фундаментальное.Так что заполняйте меня, штабельщики, и моя благодарность будет безгранична.
Изменение ElementName не помогло.Должно быть, у меня есть что-то еще, чего я не получаю.
Должен упомянуть, что я тестирую это в Silverlight.Точное сообщение, которое я получаю от Internet Explorer:
XamlParseException: Invalid attribute value for property Height.
Все это находится внутри ControlTemplate.Я делаю ползунок просто для того, чтобы научить себя этим концепциям.
Решение
Свойство ElementName привязки не поддерживается в Silverlight.
Вы заметите, что если вы войдете в код или проверите объект Binding в проводнике классов, у него нет свойства с именем ElementName.
Другие советы
Для отладки привязок данных я обычно добавляю конвертер, в котором могу установить точку останова в VS.NET.
поэтому привязка будет примерно такой:
{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}
Тогда конвертер может быть пустой реализацией IValueConverter, установить точку останова в методе Convert и посмотреть, какое значение устанавливается для высоты...
Не забудьте добавить конвертер в свои ресурсы...
Возможно, значение NaN?
Хорошо, вот сделка:
В silverlight вы не можете декларативно привязывать значения одного элемента пользовательского интерфейса к другому.Единственный способ сделать то, что я здесь пытался сделать, — это использовать код C#.
Вчера у меня была ссылка на это, но теперь, думаю, вам придется просто поверить мне на слово :)
Хм, в этом вопросе между WPF и Silverlight может быть существенная разница.
Кажется, у меня нет проблем даже с компиляцией и запуском этого примера в окне WPF:
<Slider Width="400" Height="20">
<Slider.Template>
<ControlTemplate>
<Border Name="TrackBackground"
Margin="0"
CornerRadius="2"
Grid.Row="1"
Grid.Column="1"
Background="BlanchedAlmond"
BorderThickness="1">
<Canvas x:Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
<Thumb Name="ThumbKnob" Height="{Binding ElementName=PART_Track, Path=Height, Mode=OneWay}" />
</Canvas>
</Border>
</ControlTemplate>
</Slider.Template>
</Slider>
Возможно, Silverlight имеет меньше свойств в классе Thumb...
http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx
В первую очередь дело в корпусе...
Изменять
Part_Track
к PART_Track
который исправит вашу ошибку привязки..
Но я не думаю, что вы это пытаетесь сделать..
Вы можете использовать сетку вместо холста, и размер Thumb будет изменяться автоматически.Холст на самом деле не имеет высоты, поскольку его не особо заботит высота дочерних элементов...
Надеюсь это поможет...
Кстати, граница в шаблоне?
Потому что нет необходимости в TemplateBinding, если граница не находится в шаблоне (либо ControlTemplate, либо DataTemplate).
Silverlight 3 теперь включает привязку ElementName...