Каков синтаксис привязки значений в 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.Height, когда пытаюсь запустить это. Я знаю, что мне не хватает чего-то фундаментального. Так что заполняйте меня, укладчики, и моя благодарность будет безграничной.


Изменение ElementName не помогло. Должно быть, я еще чего-то не понимаю.

Я должен упомянуть, что тестирую это в Silverlight. Точное сообщение, которое я получаю из Internet Explorer:

XamlParseException: Invalid attribute value for property Height.

Все это находится внутри ControlTemplate. Я делаю ползунок, просто чтобы научиться концепциям.

Ответов (7)

Решение

Свойство ElementName для привязки не поддерживается в Silverlight.

Вы заметите, что если вы войдете в код или проверите объект Binding в проводнике классов, у него нет свойства с именем ElementName.

Silverlight 3 теперь включает привязку ElementName ...

Кстати, граница в шаблоне?

Поскольку нет необходимости в TemplateBinding, если граница не находится в шаблоне (ControlTemplate или DataTemplate)

Что я обычно делаю для отладки привязок данных, так это добавляю конвертер, в котором я могу установить точку останова в VS.NET ..

поэтому привязка будет примерно такой:

{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}

Тогда преобразователь может быть пустой реализацией IValueConverter, установить точку останова в методе Convert и посмотреть, какая высота устанавливается на ...

Не забудьте добавить конвертер в свои ресурсы ...

Возможно, значение NaN?

Прежде всего, дело в корпусе ...

Изменять

Part_Track
к
PART_Track
который исправит вашу ошибку привязки ..

Но я не думаю, что это то, что вы пытаетесь сделать ..

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

Надеюсь это поможет...

Хм, здесь может быть существенная разница между 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

Хорошо, вот в чем дело:

В silverlight вы не можете декларативно привязать значения из одного элемента пользовательского интерфейса к другому. Единственный способ сделать то, что я пытался здесь сделать, - это использовать код C#.

Вчера у меня была ссылка на это, но теперь, думаю, вам просто нужно поверить мне на слово :)