Я все узнал о привязке в 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. Я делаю ползунок, просто чтобы научиться концепциям.





Прежде всего, дело в корпусе ...
Изменять
Part_Track to PART_Track which will fix your binding error..
Но я не думаю, что это то, что вы пытаетесь сделать ..
Вы можете использовать сетку вместо холста, и размер большого пальца изменится автоматически. У Canvas на самом деле нет высоты, потому что он не заботится о высоте своих дочерних элементов ...
Надеюсь это поможет...
Кстати, граница в шаблоне?
Поскольку нет необходимости в TemplateBinding, если граница не находится в шаблоне (ControlTemplate или DataTemplate)
Что я обычно делаю для отладки привязок данных, так это добавляю конвертер, в котором я могу установить точку останова в VS.NET ..
поэтому привязка будет примерно такой:
{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter = {StaticResources DebugConverter}}
Тогда преобразователь может быть пустой реализацией IValueConverter, установить точку останова в методе Convert и посмотреть, какая высота устанавливается на ...
Не забудьте добавить конвертер в свои ресурсы ...
Возможно, значение NaN?
Хм, здесь может быть существенная разница между 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
Свойство ElementName для привязки не поддерживается в Silverlight.
Вы заметите, что если вы войдете в код или проверите объект Binding в проводнике классов, у него нет свойства с именем ElementName.
Хорошо, вот в чем дело:
В silverlight вы не можете декларативно привязать значения из одного элемента пользовательского интерфейса к другому. Единственный способ сделать то, что я пытался здесь сделать, - это использовать код C#.
Вчера у меня была ссылка на это, но теперь, думаю, вам просто нужно поверить мне на слово :)
Silverlight 3 теперь включает привязку ElementName ...
На заметку: он есть в Silverlight 4. (и 3.5, я думаю)