2008-08-11 5 views
2

Я все узнал о привязке в WPF. Тем не менее, у меня много проблем с отладкой ошибок разбора в моем xaml. Может кто-нибудь, пожалуйста, скажите мне, что случилось с этим маленьким куском? :Что такое синтаксис привязки значений в 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. Я делаю ползунок, чтобы научить себя концепциям.

ответ

2

ElementName свойство на Binding не поддерживается в Silverlight.

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

+0

Просто к сведению: это находится в Silverlight 4. (И 3.5, я думаю) – MojoFilter 2010-06-25 12:40:45

0

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

Изменение

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

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

Вы можете использовать Grid вместо холста, и Thumb будет автоматически изменяться. Холст на самом деле не имеет высоту, потому что на самом деле не заботится о высоте своих детей ...

Надеется, что это помогает ...

0

ли Border в шаблоне BTW?

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

1

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

поэтому связывание будет что-то вроде этого:

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

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

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

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

1

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

1

Хорошо, вот сделка:

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

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

0

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