2009-09-22 43 views
40

Ok, tôi đã xem xét các câu hỏi khác và dường như không nhận được câu trả lời của tôi để hy vọng ai đó ở đây có thể.WPF Combobox DisplayMemberPath

Câu hỏi rất đơn giản tại sao thuộc tính DisplayMemberPath không liên kết với mục?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/> 

Đầu ra theo dõi cho thấy rằng nó đang cố ràng buộc với lớp đang giữ IEnumerable không phải mục thực tế trong IEnumerable. Tôi đang bối rối như một cách đơn giản để điền vào một combobox mà không cần thêm một bó một dòng trong xaml.

Đơn giản chỉ cần gọi ToString() cho đối tượng trong mục nguồn. Tôi có một công việc xung quanh đó là:

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Nhưng theo tôi thì quá nhiều cho một nhiệm vụ đơn giản như vậy. Tôi có thể sử dụng liên kết người thân không?

Trả lời

115

DisplayMemberPath chỉ định đường dẫn đến thuộc tính chuỗi hiển thị cho mỗi mục. Trong trường hợp của bạn, bạn sẽ đặt nó thành "Name", không phải là "{Binding Name}".

+0

bạn hoàn toàn tuyệt vời, tôi không thể tin rằng tôi đã bỏ lỡ điều hiển nhiên. – Jose

+0

rất vui được trợ giúp! (với một số đệm để thỏa mãn SO) –

+0

Cùng một vấn đề ở đây. Cảm ơn bạn - SO để giải cứu một lần nữa! –

7

Bạn không ràng buộc với dữ liệu trong lớp, bạn đang yêu cầu nó lấy dữ liệu từ thành viên lớp được đặt tên theo tên "thành viên", nếu trường hợp của bạn có item.Name == "steve", nó đang cố gắng lấy dữ liệu từ item.steve.

Để làm việc này, bạn nên loại bỏ ràng buộc khỏi MemberPath. Thay đổi nó thành MemberPath = "Name" điều này yêu cầu nó lấy dữ liệu từ thành viên "Tên". Bằng cách đó, nó sẽ gọi item.Name, chứ không phải item.steve.

5

Bạn nên thay đổi MemberPath="{Binding Name}" thành MemberPath="Name". Sau đó, nó sẽ làm việc.

5

Bạn có thể xóa DisplayMemberPath và sau đó đặt đường dẫn trong TextBlock.
DisplayMemberPath thực sự là khi bạn không có ItemTemplate.
Hoặc bạn có thể loại bỏ ItemTemplate của bạn và sử dụng DisplayMemberPath - trong trường hợp đó về cơ bản nó tạo ra một TextBlock cho bạn. Không được khuyên bạn nên làm cả hai.

<TextBlock text="{Binding Path=Name, Mode=OneWay}" 
2

Hoặc bạn không cần đặt DisplayMemberPath. bạn chỉ có thể bao gồm một ToString() trong đối tượng của bạn trong PromptList của bạn. như thế này:

class Prompt { 
    public string Name = ""; 
    public string Value = ""; 

    public override string ToString() { 
     return Name; 
    } 
} 

ToString() sẽ tự động được gọi và hiển thị thông số Tên từ lớp học của bạn. điều này làm việc cho ComboBoxes, ListBoxes, v.v.

+5

Đây không phải là giải pháp tốt. ToString() chỉ là chiến lược Mặc định và dự phòng chứ không phải là tiêu chuẩn để đưa thông tin đến GUI. –

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