2013-01-15 11 views
6

Tworzę niestandardowe sterowanie w WPF. Nadal poznaję tajniki tego, czym jest TemplateBinding (często używane w niestandardowych kontrolach).Użyj wiązania wielokrotnego z TemplateBindings

Uważam, że zauważam, że nie mogę użyć szablonu TemplateBinding w MulitBinding.

Kiedy próbuję to:

<ComboBox.ItemsSource> 
    <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
     <Binding ElementName="PART_AComboBox" Path="SelectedItem"/> 
     <TemplateBinding Property="MyListOne"/> 
     <TemplateBinding Property="MyListTwo"/> 
    </MultiBinding> 
</ComboBox.ItemsSource> 

otrzymuję ten błąd:

The value "System.Windows.TemplateBindingExpression" is not of type "System.Windows.Data.BindingBase" and cannot be used in this generic collection.
Parameter name: value

jestem brakuje czegoś? Czy istnieje sposób, aby to zadziałało?

To obejście mam zamiar, ale jest to rodzaj hack:

<ListBox x:Name="ListOne" 
     ItemsSource="{TemplateBinding MyListOne}" 
     Visibility="Collapsed" /> 
<ListBox x:Name="ListTwo" 
     ItemsSource="{TemplateBinding MyListTwo}" 
     Visibility="Collapsed" /> 

<ComboBox.ItemsSource> 
    <MultiBinding Converter="{StaticResource DictionaryFilteredToKeysConverter}"> 
     <Binding ElementName="PART_TextTemplateAreasHost" Path="SelectedItem"/> 
     <Binding ElementName="ListOne" Path="ItemsSource"/> 
     <Binding ElementName="ListTwo" Path="ItemsSource"/> 
    </MultiBinding> 
</ComboBox.ItemsSource> 

wiążę listboxes do właściwości zależności, a następnie w moim mulitbinding mam zrobić elementu wiążą się z ItemsSource z pola listy.

Jak wspomniałem powyżej, to jest jak hack i Chciałbym wiedzieć, czy istnieje poprawny sposób na MultiBinding z TemplateBinding jako jeden z komponentów.

Odpowiedz

16

Można użyć:

<Binding Path="MyListOne" RelativeSource="{RelativeSource TemplatedParent}"/> 

TemplateBinding jest naprawdę tylko krótki ręka, zoptymalizowana wersja powyższego. Jest bardzo rygorystyczne, gdzie i jak można go użyć (bezpośrednio wewnątrz szablonu bez hierarchicznej ścieżki itd.).

Kompilator XAML jest nadal dość bzdurny w udzielaniu przyzwoitych informacji zwrotnych na temat tego rodzaju problemów (przynajmniej w wersji 4.0, nie przetestowany specjalnie w tym celu). Właśnie teraz miał ten XAML:

<ControlTemplate TargetType="..."> 
    <Path ...> 
     <Path.RenderTransform> 
      <RotateTransform Angle="{TemplateBinding Tag}"/> 
     </Path.RenderTransform> 
    </Path> 
</ControlTemplate> 

on opracowany i wykonany w porządku, ale nie był wiążący wartość w Tag do kąta obrotu. Podszedłem i zobaczyłem, że nieruchomość jest związana, ale zero. Intuicyjnie (po latach radzenia sobie z tą irytacją) zmieniłem go na:

<ControlTemplate TargetType="..."> 
    <Path ...> 
     <Path.RenderTransform> 
      <RotateTransform Angle="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}"/> 
     </Path.RenderTransform> 
    </Path> 
</ControlTemplate> 

I wszystko działało dobrze.

+0

Idealnie! Dzięki za wspaniałą odpowiedź! – Vaccano

Powiązane problemy