2012-05-11 47 views
5

Tôi có một ComboBox hiển thị văn bản có độ dài khác nhau. Đối với các văn bản không dài thì không có vấn đề gì. Đối với các văn bản dài hơn chiều rộng của ComboBox tôi muốn cắt văn bản và thêm "..." (dấu chấm lửng) ở cuối để hiển thị chúng đúng cách. Điểm mấu chốt là tôi không muốn thay đổi chiều rộng của ComboBox. Có ai biết cách để làm điều này không?Cách hiển thị văn bản quá dài trong WPF ComboBox

Trả lời

11

Sử dụng tùy chỉnh ItemTemplate cho số ComboBox, sử dụng số TextBlock với thuộc tính TextTrimming được đặt thành CharacterEllipsis.

Ví dụ:

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

Ràng buộc tồn tại trên Combobox trước đây không hoạt động ở định dạng này – Prat

+0

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

0

Bạn có thể sử dụng TextTrimmingCharacterEllipsis hoặc WordEllipsis cho các textblocks trong combobox của mình.

0

Câu trả lời, như Ross nói, là để thực hiện một tùy chỉnh ItemTemplate. Tuy nhiên, để làm cho nó hoạt động đúng, bạn cần phải thực hiện việc ràng buộc đúng cách.

Lưu ý về phương pháp này: Bạn không thể đặt cả số DisplayMemberPathItemTemplate, nó phải là một hoặc cái kia.

Vì vậy, đối với trường hợp tổng thể nơi thành viên hiển thị là mục (ví dụ như đối với một string), bạn có thể sử dụng ràng buộc không có tính liên kết với các DataContext của mẫu:

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

Hoặc, bạn có thể đặt nó theo phong cách.

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

Đối với trường hợp bạn muốn liên kết với một tài sản cụ thể của đối tượng, tương tự như cách bạn sẽ sử dụng DisplayMemberPath bất động sản, thay thế các ràng buộc với các ràng buộc mà bạn sẽ sử dụng để một tài sản trên các đối tượng đó bạn đang ràng buộc. Vì vậy, hãy thay thế dòng thứ tư trong ví dụ đầu tiên của tôi bằng một cái gì đó như thế này:

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

Ràng buộc là trong bối cảnh của một mục duy nhất thuộc loại được kết hợp với ComboBox của bạn. Để làm điều này rõ ràng hơn, bạn có thể làm như sau:

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

này sẽ cung cấp cho bạn những gợi ý cho các thuộc tính trên đối tượng trong khi bạn đang viết mã bên trong DataTemplate.

Các vấn đề liên quan