2013-01-15 18 views
6

Tôi đang thực hiện một điều khiển tùy chỉnh trong WPF. Tôi vẫn đang tìm hiểu về những gì mà TemplateBinding đang sử dụng (được sử dụng rất nhiều trong các điều khiển tùy chỉnh).Sử dụng MulitBinding với TemplateBindings

Một người nghĩ rằng tôi nhận thấy rằng tôi dường như không thể sử dụng một TemplateBinding bên trong một MulitBinding.

Khi tôi cố gắng này:

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

tôi nhận được lỗi này:

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

Tôi có thiếu cái gì? Có cách nào để làm cho công việc này?

Đây là workaround Tôi đã đi, nhưng nó là loại một 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> 

tôi ràng buộc listboxes đến tài sản phụ thuộc và sau đó trong mulitbinding của tôi, tôi làm một ràng buộc yếu tố để ItemsSource của các hộp danh sách.

Như tôi đã nói ở trên, điều này giống như một hack và Tôi muốn biết nếu có một cách chính xác để làm một MultiBinding với một TemplateBinding là một trong những thành phần.

Trả lời

16

Bạn có thể sử dụng:

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

TemplateBinding là thực sự chỉ là một đoạn ngắn tay, tối ưu hóa phiên bản của trên. Nó rất nghiêm ngặt ở đâu và làm thế nào nó có thể được sử dụng (trực tiếp bên trong khuôn mẫu mà không có đường dẫn phân cấp và cetera).

Trình biên dịch XAML vẫn còn khá rác khi đưa ra phản hồi tốt về các loại vấn đề này (ít nhất là 4.0, không được thử nghiệm 4.5 cụ thể cho việc này). Tôi vừa mới có XAML này:

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

Nó được biên soạn và thực hiện tốt nhưng không ràng buộc giá trị trong Tag đến góc quay. Tôi rình mò và thấy rằng tài sản bị ràng buộc, nhưng không. Trực giác (sau nhiều năm đối phó với sự khó chịu này) tôi đã thay đổi nó thành:

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

Và nó hoạt động tốt.

+0

Hoàn hảo! Cảm ơn câu trả lời tuyệt vời! – Vaccano