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>
Đ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
@ 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ọ). –
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