Sự khác biệt giữa chọnItem, chọnValue và chọnValuePath


351

Sự khác biệt của betweeen như sau:

Tất cả các thuộc tính phụ thuộc này được định nghĩa trong lớp Selector . Tôi thường nhầm lẫn SelectedItemvới SelectedValue, và SelectedValuevới SelectedValuePath.

Tôi muốn biết sự khác biệt giữa chúng và khi nào chúng ta sử dụng chúng, đặc biệt SelectedValueSelectedValuePath. Hãy giải thích việc sử dụng chúng với một số ví dụ đơn giản.


3
Bea có một bài đăng blog với lời giải thích và mã mẫu mà bạn có thể tải xuống ... bea.stollnitz.com/blog/?p=9
Aaron McIver

2
bản sao có thể có của [Nhầm lẫn với wpf ComboBox DisplayMemberPath,

Câu trả lời:


552

Tên của họ có thể hơi khó hiểu :). Đây là một bản tóm tắt:

  • Các SelectedItem tài sản trả về toàn bộ đối tượng rằng danh sách của bạn chắc chắn sẽ. Vì vậy, giả sử bạn đã ràng buộc một danh sách với một bộ sưu tập các Categoryđối tượng (với mỗi đối tượng Danh mục có thuộc tính Tên và ID). ví dụ. ObservableCollection<Category>. Các SelectedItembất động sản sẽ trở lại bạn hiện đang được chọn Categoryđối tượng. Đối với ràng buộc mục đích tuy nhiên, điều này không phải lúc nào những gì bạn muốn, vì điều này chỉ cho phép bạn để ràng buộc toàn bộ một đối tượng loại tài sản mà danh sách được liên kết với, không phải là giá trị của một tài sản duy nhất trên đó loại đối tượng (ví dụ như nó IDsở hữu ).

  • Do đó, chúng tôi có thuộc tính chọnValuePath và thuộc tính chọnValue như một phương tiện ràng buộc khác (bạn sử dụng chúng kết hợp với nhau). Giả sử bạn có một Productđối tượng, rằng chế độ xem của bạn bị ràng buộc (với các thuộc tính cho những thứ như ProductName, Trọng lượng, v.v.). Giả sử bạn có một thuộc CategoryIDtính trên đối tượng Sản phẩm đó và bạn muốn người dùng có thể chọn một danh mục cho sản phẩm từ danh sách các danh mục. Bạn cần thuộc tính ID của đối tượng Danh mục được gán cho thuộc CategoryIDtính trên đối tượng Sản phẩm. Đây là nơi cácSelectedValuePathSelectedValueCác thuộc tính đi vào. Bạn chỉ định rằng thuộc tính ID trên đối tượng Danh mục phải được gán cho thuộc tính trên đối tượng Sản phẩm mà danh sách bị ràng buộc sử dụng SelectedValuePath='ID', sau đó liên kết thuộc SelectedValuetính với thuộc tính trên DataContext (ví dụ: Sản phẩm).

Ví dụ dưới đây chứng minh điều này. Chúng tôi có một ComboBox liên kết với một danh sách Danh mục (thông qua ItemSource). Chúng tôi đang ràng buộc thuộc tính CategoryID trên Sản phẩm làm giá trị được chọn (sử dụng thuộc tính ChọnValue). Chúng tôi liên quan đến điều này với thuộc tính ID của Danh mục thông qua thuộc tính ChọnValuePath. Và chúng tôi đang nói chỉ hiển thị thuộc tính Tên trong ComboBox, với thuộc tính DisplayMemberPath).

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

Ban đầu hơi khó hiểu, nhưng hy vọng điều này làm cho nó rõ ràng hơn một chút ... :)

Chris


8
Cảm ơn đã giải thích. Bạn có phải là người đã viết sách về Silverlight không? Tôi không tin là tôi đang nói chuyện với bạn. : -) ... Tôi đang đọc cuốn sách này ngày nay. Thực sự là một công việc tuyệt vời. :-)
Nawaz

22
Đúng, đó là tôi :). Tôi quanh quẩn những phần này ở đây để trả lời câu hỏi khi tôi có thể. Vui mừng bạn đang thưởng thức cuốn sách :). Vì bạn đã có cuốn sách, bạn sẽ tìm thấy thêm thông tin về chủ đề này trên các trang 69-70 và trang 204.
Chris Anderson

8
+1. +100. Bạn, thưa ngài, là một vị thần vàng trong số những người đàn ông thấp kém hơn. Có thể Chúa phù hộ bạn, và tất cả những người đi thuyền trong bạn. :) Nghiêm túc mà nói, tôi chỉ mất hai giờ để cố gắng tìm ra điều đó - cảm ơn bạn!
TarkaDaal

1
@Chris Anderson: Điều gì xảy ra nếu đối tượng Sản phẩm có thuộc tính Danh mục (loại Danh mục) thay vì Danh mục? Làm cách nào tôi có thể cập nhật thuộc tính Danh mục này khi thay đổi ComboBox thông qua ràng buộc?
Lucifer

2
@Lucifer: Trong trường hợp này, bạn sẽ sử dụng thuộc tính chọnItItem như vậy: <ComboBox ItemSource = "{Binding Category}" chọnItem = "{Binding Category, Mode = TwoWay}" /> Hy vọng điều này sẽ giúp ích.
Chris Anderson

69

Để trả lời một chút về khái niệm:

SelectedValuePathđịnh nghĩa thuộc tính nào (theo tên của nó) của các đối tượng được liên kết với ListBox ItemsSourcesẽ được sử dụng làm mục SelectedValue.

Ví dụ, nếu ListBox của bạn được liên kết với một tập hợp các Personđối tượng, mỗi trong số đó có Name, AgeGendertài sản, SelectedValuePath=Namesẽ làm cho giá trị của lựa chọn Personcủa Nametài sản để được trả lại trong SelectedValue.

Lưu ý rằng nếu bạn ghi đè ControlTemplate của ListBox (hoặc áp dụng Kiểu) chỉ định thuộc tính nào sẽ hiển thị, SelectedValuePathkhông thể được sử dụng.

SelectedItem, trong khi đó, trả về toàn bộ Personđối tượng hiện được chọn.

(Đây là một ví dụ khác từ MSDN , sử dụng TreeView)

Cập nhật: Như @Joe đã chỉ ra, thuộc tính DisplayMemberPath không liên quan đến các thuộc tính được chọn *. Mô tả đúng của nó như sau:

Lưu ý rằng các giá trị này khác với DisplayMemberPath(được xác định trên ItemControl, không phải Selector), nhưng thuộc tính đó có hành vi tương tự SelectedValuePath: khi không có kiểu / mẫu, nó xác định thuộc tính nào của đối tượng được liên kết với mục nên được sử dụng làm thuộc tính biểu diễn chuỗi.


8

SelectedItemlà một object. SelectedValueSelectedValuePathstrings.

ví dụ: sử dụng ListBox:

nếu bạn nói hãy cho tôi, listbox1.SelectedValuenó sẽ trả về văn bản của mục hiện được chọn.

string value = listbox1.SelectedValue;

nếu bạn nói hãy cho tôi listbox1.SelectedItemnó sẽ cung cấp cho bạn toàn bộ đối tượng.

ListItem item = listbox1.SelectedItem;
string value = item.value;

3
SelectedValuecũng là một objectvà không a string. Xin vui lòng xem tại đây
john_m

5

lấy cảm hứng từ câu hỏi này tôi đã viết một blog cùng với đoạn mã ở đây . Dưới đây là một số trích đoạn từ blog

Chọn mục - Mục được chọn giúp liên kết giá trị thực từ Nguồn dữ liệu sẽ được hiển thị. Đây là loại đối tượng và chúng ta có thể liên kết bất kỳ loại có nguồn gốc từ loại đối tượng với thuộc tính này. Vì chúng tôi sẽ sử dụng liên kết MVVM cho các hộp tổ hợp của mình trong trường hợp đó, đây là thuộc tính mà chúng tôi có thể sử dụng để thông báo cho VM rằng mục đó đã được chọn.

ChọnValue và chọnValuePath - Đây là hai thuộc tính khó hiểu và bị hiểu sai nhất cho combobox. Nhưng các thuộc tính này đến để giải cứu khi chúng ta muốn liên kết combobox của mình với giá trị từ đối tượng đã được tạo. Vui lòng kiểm tra kịch bản cuối cùng của tôi trong danh sách sau đây để có ý tưởng ngắn gọn về các thuộc tính.


1

Mọi điều khiển sử dụng Bộ sưu tập để lưu trữ dữ liệu đều có thuộc tính ChọnValue, chọnItem. Ví dụ về các điều khiển này là ListBox, Dropdown, RadioButtonList, CheckBoxList.

Để cụ thể hơn nếu bạn thực sự muốn lấy Văn bản của Mục đã chọn thì bạn có thể viết:

ListBox1.SelectedItem.Text;

ListBox1 của bạn cũng có thể trả về Văn bản bằng cách sử dụng thuộc tính chọnValue nếu giá trị đã được đặt thành trước đó. Nhưng ở trên là cách hiệu quả hơn để có được văn bản.

Bây giờ, giá trị là thứ không thể nhìn thấy đối với người dùng nhưng nó được sử dụng chủ yếu để lưu trữ trong cơ sở dữ liệu. Chúng tôi không chèn Văn bản của ListBox1, tuy nhiên chúng tôi cũng có thể chèn Văn bản, nhưng chúng tôi đã sử dụng để chèn giá trị của mục đã chọn. Để có được giá trị chúng ta có thể sử dụng

ListBox1.SelectedValue

Nguồn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.