Каков синтаксис привязки значений в xaml?
Я узнал все о связывании в 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. Высота, когда я пытаюсь запустить это. Я знаю, что, должно быть, упускаю что-то фундаментальное. Так что напишите меня, укладчики, и моя благодарность будет безграничной.
Изменение ElementName не помогло. Должно быть что-то еще, чего я не получаю.
Я должен упомянуть, что я тестирую это в Silverlight. Точное сообщение, которое я получаю из Internet Explorer:
XamlParseException: Invalid attribute value for property Height.
Все это находится внутри шаблона ControlTemplate. Я делаю управление ползунком только для того, чтобы научить себя концепциям.
8 ответов
Свойство 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
которая исправит вашу ошибку привязки..Но я не думаю, что это то, что вы пытаетесь сделать..
Вы можете использовать сетку вместо холста, и большой палец будет изменяться автоматически. У холста на самом деле нет высоты, потому что он не заботится о росте своих детей...
Надеюсь это поможет...
Между прочим, граница в шаблоне?
Потому что нет необходимости в TemplateBinding, если граница не находится в шаблоне (ControlTemplate или DataTemplate).
Хм нах:)
Это не похоже на это: