2008-11-07 9 views
6

Tôi dường như không thể thiết lập một ContentTemplate cho một ComboBoxItem. Có lý do tôi đang cố gắng để làm điều này là tôi muốn có 2 lần xuất hiện cho dữ liệu của tôi trong hộp combo. Khi hộp kết hợp được mở (menu là xuống) Tôi muốn có một hộp văn bản (với tên của hình ảnh) và một điều khiển hình ảnh bên dưới nó. Khi tôi chọn mục tôi muốn hộp kết hợp để chỉ hiển thị một hộp văn bản với tên của hình ảnh.Làm cách nào để sử dụng mẫu khác cho trạng thái đã chọn và thả xuống trong hộp kết hợp trong Silverlight?

Tôi nghĩ tôi có thể đạt được điều này bằng cách sửa đổi ItemTemplate và ItemContainerStyle của ComboBox. ItemContainerStyle chứa ContentPresenter sau:

<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 

Vì vậy, tôi giả định rằng tôi có thể đặt ContentTemplate tại đây và nó sẽ hoạt động. Nhưng tôi dường như không thể có được nó để làm việc:

<DataTemplate x:Key="ComboBoxDataTemplate"> 
      <Grid> 
       <TextBlock Text="{Binding Path='Name'}"/> 
      </Grid> 
     </DataTemplate> 

<DataTemplate x:Key="ComboBoxItemTemplate"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path='Name'}"/> 
       <Image Source="{Binding Path='Source'}" Width="64" Height="64"/> 
      </StackPanel> 
     </DataTemplate> 

     <Style x:Key="ComboBoxItemStyle1" TargetType="ComboBoxItem"> 
... 
      <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxItemTemplate}"/> 

... 

Dưới đây là combo box của tôi:

<ComboBox Width="70" Margin="3,0,0,0" 
         ItemsSource="{StaticResource Source}" 
         ItemTemplate="{StaticResource ComboBoxDataTemplate}" 
         ItemContainerStyle="{StaticResource ComboBoxItemStyle1}" 
         /> 

Cách duy nhất tôi có thể có được điều này để làm việc là để loại bỏ các ContentPresenter từ ItemContainerStyle, và thay thế nó bằng nội dung của mẫu tùy chỉnh của tôi (ComboBoxItemTemplate). Nhưng tôi không nghĩ rằng tôi nên sử dụng phương pháp này vì nó có nghĩa là ContentPresenter không còn tồn tại (và mã trong ComboBox có thể dựa vào nó hiện có).

Bất kỳ trợ giúp nào về việc hiển thị hộp tổ hợp có trình đơn thả xuống khác và mẫu được chọn sẽ được đánh giá cao!

Trả lời

5

ComboBox.ItemTemplate chỉ là một cách thuận tiện để đặt ComboBoxItem.ContentTemplate. Vì vậy, mã của bạn ở trên về cơ bản cố gắng thiết lập ComboBoxItem.ContentTemplate hai lần.

Như Jobi đã chỉ ra, bạn có thể thử chỉ sử dụng Kiểu tùy chỉnh. Bạn có thể loại trừ một cách an toàn ContentPresenter, nếu bạn luôn biết loại Nội dung. ContentPresenter chỉ cho phép bạn sử dụng một DataTemplate để hiển thị một số dữ liệu ngẫu nhiên. Nhưng bạn chỉ có thể thay thế nó bằng một TextBlock và một hình ảnh. Bạn chỉ mất khả năng chỉ định một DataTemplate.

Vấn đề với cách tiếp cận của Jobi là mục được chọn sẽ không hiển thị hình ảnh của nó, ngay cả khi nó nằm trong menu thả xuống. Thực sự mục đã chọn được hiển thị ở hai vị trí (trình đơn thả xuống và phần chính của ComboBox). Ở một vị trí bạn muốn có một DataTemplate, và bạn muốn có một DataTemplate khác trong một vị trí khác.

Đặt cược tốt nhất của bạn là đặt lại ComboBox. Bạn có thể lấy Kiểu mặc định từ here. Có một ContentPresenter với tên "ContentPresenter". Bạn sẽ cần phải:

  1. Remove/thay đổi tên của ContentPresenter, vì vậy các ComboBox sẽ không tự động thiết lập các thuộc tính Content/ContentTemplate
  2. Bind các ContentPresenter.sở hữu nội dung như sau: "{TemplateBinding SelectedObject}"
  3. Thiết lập thuộc tính ContentPresenter.ContentTemplate để DataTemplate của bạn mà không ảnh
  4. Thiết lập thuộc tính ComboBox.ItemTemplate đến DataTemplate với một hình ảnh và TextBlock như bạn đã
  5. Hãy cho Style ComboBox một chìa khóa rõ ràng, giống như x: Key = "MyComboBoxStyle"
  6. Sử dụng Style trên ComboBox của bạn, giống như Style = "{StaticResource MyComboBoxStyle}"

này có hiệu quả lờ đi ComboBoxItem.ContentTemplate khi hiển thị đã chọn ite m trong cơ thể của ComboBox, nhưng sử dụng nó khi hiển thị ComboBoxItem trong trình đơn thả xuống.

+0

Thực sự hữu ích. Cảm ơn. Chỉ cần làm rõ như tôi đã vật lộn với những gì để thay thế 'SelectedObject' với, mặc dù bây giờ nó có vẻ hiển nhiên. đoạn mã của tôi cho ContentPresenter trông như thế này:

0

Bạn có thể đạt được điều này chỉ với ItemsContainerStyle. Thêm TextBlock và hình ảnh của bạn thay vì ContentPresenter. Thêm VisualStateManager và chuyển đổi chế độ hiển thị của điều khiển hình ảnh dựa trên Trạng thái đã chọn của VSM.

+0

Vậy điểm của ItemTemplate là gì và cũng sẽ không có ContentPresenter gây ra sự cố tiềm ẩn? –

0

DataTemplate chủ yếu để hiển thị dữ liệu của bạn, Tốt hơn là cung cấp cho tất cả các động lực liên quan đến giao diện người dùng bên trong ControlTemplate (Hành vi kiểm soát). Không có vấn đề tiềm năng nếu bạn không có một ContentPresenter. Vấn đề duy nhất là nếu bạn muốn sử dụng lại ControlTemplate này từ một số ComboBox khác. Sau đó, bạn có thể khai báo một mẫu Kiểm soát sạch khác với một ContentPresenter ở đó.