2012-05-11 3 views
5

У меня есть ComboBox, который показывает текст разной длины. Для текстов, которые не долго, проблем нет. Для текстов дольше, чем ширина ComboBox, я хотел бы обрезать текст и добавить «...» (эллипсис) в конце, чтобы показать их правильно. Суть в том, что я не хочу менять ширину ComboBox. Кто-нибудь знает как это сделать?Как правильно отображать слишком длинный текст в WPF ComboBox

ответ

11

Используйте пользовательские ItemTemplate для ComboBox, что делает использование TextBlock с TextTrimming имущества, установленным в CharacterEllipsis.

Пример:

<ComboBox ItemsSource="..." SelectedValuePath="..."> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock 
     Text="{Binding ...}" 
     TextTrimming="CharacterEllipsis" /> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
+0

Связывание, существующее в Combobox ранее, не работает в этом формате – Prat

+0

http://stackoverflow.com/questions/18825882/combobox-textwrap-binding – Prat

0

Вы можете использовать TextTrimmingCharacterEllipsis или WordEllipsis для текстовых блоков в своем поле со списком.

0

Ответ, как сказал Росс, является реализация пользовательских ItemTemplate. Однако, чтобы заставить его работать правильно, вам необходимо выполнить привязку должным образом.

Примечание к этому методу: вы не можете установить DisplayMemberPath и ItemTemplate, он должен быть тем или иным.

Таким образом, в общем случае, когда элемент отображения является элемент (например, для строки), вы можете использовать связывание без свойств связываться с DataContext шаблона:

<ComboBox ItemsSource="..." SelectedValuePath="..."> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Или, вы можете поместить его в стиле.

<Style TargetType="{x:Type ComboBox}"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Для случая, когда вы хотите связать с конкретным свойством объекта, подобно тому, как вы будете использовать DisplayMemberPath свойство, заменить связывание с привязкой, что вы будете использовать в собственности на объект, вы привязываетесь. Таким образом, заменить четвертую строчку в моем первом примере с чем-то вроде этого:

<TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" /> 

Связывание в контексте одного элемента типа, связанного с вашей ComboBox. Для того, чтобы сделать это более явным, вы можете сделать следующее:

<DataTemplate DataType="{x:Type namespace:MyItemType}"> 
    <!-- My DataTemplate stuff here --> 
</DataTemplate> 

Это даст вам подсказки для свойств объекта в то время как вы пишете код внутри DataTemplate.

Смежные вопросы