2009-07-10 24 views
5

Tôi sử dụng biểu dữ liệu để trực quan hóa một số mục trong ComboBox, ItemsSource được gắn với ObservableCollection. Để giữ cho nó đơn giản, giả sử tôi đặt người vào ObservableCollection:Đặt TextSearch.Tiếp theo cho WPF-ComboBoxItem qua DataTemplate

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

My DataTemplate trông như thế này:

<DataTemplate TargetType="{x:Type Person}"> 
    <StackPanel Orientation="Horizontal"> 
    <TextSearch.Text> 
     <MultiBinding StringFormat="{} {0} {1}"> 
     <Binding Path="FirstName"/> 
     <Binding Path="LastName"/> 
     </MultiBinding> 
    </TextSearch.Text> 
    <TextBlock Text="{Binding FirstName}" Margin="2,0" /> 
    <TextBlock Text="{Binding LastName}"/> 
    </StackPanel> 
</DataTemplate> 

Bây giờ tôi muốn để cho phép tự động gõ cho tên đầy đủ trong ComboBox mà không giới thiệu một thứ ba tài sản trên lớp người của tôi. Do đó tôi không muốn sử dụng TextSearch.TextPath bất động sản trên ComboBox, nhưng thay vào đó tôi muốn ràng buộc TextSearch.Text-Property của mỗi ComboBoxItem trong DataTemplate. Thật không may, khi tôi làm điều này (mà làm việc với một MultiBinding và StringFormat, thử nghiệm với Snoop), giá trị ràng buộc chỉ được đăng ký cho StackPanel của tôi, nhưng sử dụng Snoop (công cụ tuyệt vời) tôi thấy rằng stackpanel này phục vụ như nội dung cho một số ComboBoxItemTemplate, mà đặt một biên giới vv và cuối cùng là một ComboBoxItem-tag xung quanh StackPanel bên ngoài của tôi. Do đó, thiết lập TextSearch.Text không hiệu quả, vì nó phải được đặt trong ComboBoxItem đã tạo và không phải ở đâu đó bên trong.

Câu hỏi ngay: Làm cách nào để tôi có thể tuyên truyền TextSearch này.Tiếp tục thuộc tính từ DataTemplate của tôi tới ComboBoxItem xung quanh bằng XAML-Styles và -Control-Templates? Giải pháp có thể sửa đổi các ControlTemplates mặc định của ComboBox và ComboBoxItem và DataTemplate tùy chỉnh (Item-) của tôi, nhưng không sử dụng bất kỳ Code-Behind nào, hoặc ít nhất là không quá nhiều. Có lẽ một hành vi đính kèm cũng sẽ ổn thôi. Nhưng tôi gần như chắc chắn phải có một cách để làm cho nó làm việc mà không có, TemplateBinding hoặc RelativeSource-stuff ... Và tất nhiên giải pháp phải làm cho lựa chọn bàn phím của tôi và công việc textcompletion, s.th. khi danh sách có chứa Hans Josef và Hans Peter, sau đó nhập 'Hans' nên tự động đề nghị Hans Josef, trong khi nhập 'Hans P' đủ nhanh nên tự động đề nghị Hans Peter.

Bất kỳ giải pháp?

+0

Ít nhất là bây giờ tôi cảm thấy khá tự tin, rằng nhiệm vụ thực sự không quá dễ dàng. Hoặc văn bản dài chỉ làm cho mọi người bỏ chạy trong hoảng loạn ... –

+0

Tôi gần để từ bỏ nó. Tôi quản lý để có được ComboBoxItem để thực hiện đúng TextSearch.Text-bất động sản bằng cách thiết lập nó trong ComboBox.ItemContainerStyle (thay vì ItemTemplate, như tôi đã làm trước). Bây giờ có vẻ khá đẹp trong cây thị giác (Snoop một lần nữa), nhưng tiếc là nó không có hiệu lực. Không có lựa chọn nào được thực hiện sau khi gõ 'Hans' hoặc bất cứ điều gì. –

Trả lời

1

Nội dung xung quanh bảng điều khiển của bạn là vùng chứa mặc định. Bạn cần áp dụng thuộc tính TextSearch.Text cho vùng chứa. Bạn sẽ có thể làm điều này bằng cách thiết lập thuộc tính thông qua ItemContainerStyle như vậy:

<ComboBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ComboBoxItem}"> 
     <Setter Property="TextSearch.Text"> 
      <Setter.Value> 
       <MultiBinding StringFormat="{} {0} {1}"> 
        <Binding Path="FirstName"/> 
        <Binding Path="LastName"/> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ComboBox.ItemContainerStyle> 
+0

Âm thanh hoàn toàn hợp lý, nhưng tiếc là không hoạt động. Lựa chọn bàn phím hoạt động không như mong muốn, có lẽ đầu vào vẫn được so sánh với giá trị ToString của người đó, textearch.text không có tác dụng gì cả. Tôi cho rằng các ràng buộc không hoạt động, nhưng ComboBox bỏ qua nó. –

+0

không hoạt động đối với tôi, bạn không thể nhắm mục tiêu TextSearch.Text này từ kiểu – Hisham

8

câu trả lời ngắn gọn: những gì bạn muốn làm không thể được thực hiện trực tiếp trong XAML, nhưng có những cách khác để làm điều đó.

Câu trả lời dài: ComboBox tìm thuộc tính TextSearch.Text trực tiếp trên các mục dữ liệu được lưu trữ trong bộ sưu tập Items hoặc ItemsSource. Do đó, bạn không thể đặt thuộc tính trong mẫu hoặc kiểu dữ liệu vì chúng áp dụng cho các đối tượng được sử dụng để hiển thị các mục dữ liệu và không phải là các mục dữ liệu.

Cụ thể, nếu bạn xem các ví dụ trên trang TextSearch class, bạn sẽ thấy rằng chúng đính kèm thuộc tính TextSearch.Text vào đối tượng Hình ảnh đi vào bộ sưu tập ComboBox.Items. Bạn có thể làm điều này trong chương trình của bạn bằng cách đặt Person thành DependencyObject, nhưng tôi không nghĩ rằng bạn muốn đặt thuộc tính trên mọi đối tượng như thế.

Bạn có nhiều lựa chọn ở đây:

Nếu bạn có thể sửa đổi các lớp Person, bạn có thể xác định phương pháp ToString() để trả lại văn bản để tự động hoàn thành hoặc xác định một tài sản độc đoán như Họ và tên và thiết lập Textsearch.TextPath trên ComboBox.Ví dụ:

public class Person 
{ 
    string FirstName { get; set; } 
    string LastName {get; set; } 
    string FullName { get { return String.Format("{0} {1}", FirstName, LastName); } } 
} 

<ComboBox TextSearch.TextPath="FullName" ItemsSource="collectionOfPersons"/> 

Altenatively, nếu bạn không muốn chạm vào người, bạn có thể tạo ra một lớp wrapper đó cho thấy nhiều các đặc tính này.

+2

Tôi e là bạn đúng. Bởi bây giờ không có giải pháp làm việc mà không thêm một thuộc tính bổ sung cho lớp hoặc thậm chí một lớp mới bao bọc và mở rộng lớp cũ. Khi câu hỏi nói rằng những khả năng này được biết nhưng không muốn, tôi không thể đánh dấu câu trả lời này là _the_ - ​​trừ khi có thể nếu bạn mở rộng câu trả lời ngắn bằng một số bằng chứng hoặc giải thích, tại sao điều đó là không thể. –

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