2011-11-26 36 views
13

Tôi có một ComboBox với mẫu khá phức tạp đối với mặt hàng cá nhân, trong đó bao gồm hai hình ảnh và một vài dòng văn bản:mẫu khác nhau cho các mục trong danh sách thả xuống ComboBox và cho chọn mục

enter image description here

Tuy nhiên, mục được chọn trong chính bản thân số ComboBox không hiển thị chính xác vì không gian dọc quá hạn chế (tôi không thể làm cho nó cao hơn, vì nó là một phần của một ToolBar).

Làm cách nào để làm cho ComboBox sử dụng mẫu khác cho mục được hiển thị trong chính số ComboBox? (mặc định ToString đại diện sẽ làm tốt)

Cảm ơn!

+0

Đang sử dụng DataTemplateSelector sẽ làm các trick cho bạn hoặc bạn đang tìm kiếm một soluion khác? Có lẽ tôi không nhận được câu hỏi đúng? – sll

+0

@ sll Tôi không nghĩ rằng DataTemplateSelector có thể làm điều này (tôi đã không thử nó mặc dù), IIRC nó được đánh giá chỉ khi các mục đang được nạp. Dù sao tôi sẽ thích một số giải pháp đơn giản mà sẽ không liên quan đến một lớp học cho mỗi ComboBox tôi tạo ra (sẽ có một số người trong số họ). –

+0

Ok bạn đang cố gắng đạt được điều gì? Biểu diễn giao diện người dùng khác nhau cho các mục dựa trên một số tiêu chí? – sll

Trả lời

27

Các sản phẩm được chọn (trong ComboBox bản thân, không phải là thả xuống) không phải là bên trong một ComboBoxItem để bạn có thể làm điều gì đó như thế này:

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}"> 
      <ContentControl.Style> 
       <Style TargetType="{x:Type ContentControl}"> 
        <!-- Complex default template --> 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Image Source="{Binding XPath=media:thumbnail/@url}" Width="100" Height="100" /> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <!-- Simple selection box template --> 
         <DataTrigger 
           Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" 
           Value="{x:Null}"> 
          <Setter Property="ContentTemplate"> 
           <Setter.Value> 
            <DataTemplate> 
             <TextBlock Text="{Binding XPath=title}" /> 
            </DataTemplate> 
           </Setter.Value> 
          </Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

(Edit: Lưu ý rằng các ràng buộc trong cho Có nhiều tùy chọn khác nhau để vượt qua điều này, một trong số đó là một công cụ chuyển đổi giá trị tùy chỉnh trả về true hoặc false tùy thuộc vào việc tổ tiên có tồn tại (đi bộ theo cách thủ công).)

+0

Cảm ơn, hãy làm việc tuyệt vời! –

+0

Bạn được chào đón, vui vì nó đã giúp :) –

+0

Tuyệt vời! Cám ơn! Ymmd :) – pr0gg3r

5

Tôi đang tìm kiếm giải pháp chuẩn (không phải hacky và không có lỗi ràng buộc) cho vấn đề này. Và tôi đã tìm thấy nó here: sử dụng DataTemplateSelector.

Cũng giống như ý tưởng trên mỗi @H.B. answer: kiểm tra bất cứ khi nào có một ComboBoxItem làm cha mẹ trong cây trực quan.

public class ComboBoxItemTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate SelectedTemplate { get; set; } 
    public DataTemplate DropDownTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     while (container != null) 
     { 
      container = VisualTreeHelper.GetParent(container); 
      if (container is ComboBoxItem) 
       return DropDownTemplate; 
     } 
     return SelectedTemplate; 
    } 
} 

Cách sử dụng:

<ComboBox.ItemTemplateSelector> 
    <local:ComboBoxItemTemplateSelector> 
     <local:ComboBoxItemTemplateSelector.SelectedTemplate> 
      <DataTemplate> 
       ... simple template for selected item 
      </DataTemplate> 
     </local:ComboBoxItemTemplateSelector.SelectedTemplate> 
     <local:ComboBoxItemTemplateSelector.DropDownTemplate> 
      <DataTemplate> 
       ... complex template used by dropdown items 
      </DataTemplate> 
     </local:ComboBoxItemTemplateSelector.DropDownTemplate> 
    </local:ComboBoxItemTemplateSelector> 
</ComboBox.ItemTemplateSelector> 
Các vấn đề liên quan