SelectedItem, SelectedValue 및 SelectedValuePath의 차이점


351

차이점은 다음과 같습니다.

이러한 모든 종속성 속성은 Selector 클래스에 정의되어 있습니다. 나는 종종 혼동 SelectedItem으로 SelectedValue하고 SelectedValueSelectedValuePath.

나는 그들 사이의 차이점을 알고 싶습니다. 또한 언제 SelectedValue그리고 특히 언제 사용합니까 SelectedValuePath? 간단한 예제를 통해 사용법 을 설명하십시오 .


3
Bea는 다운로드 할 수있는 설명 및 샘플 코드가 포함 된 블로그 게시물을 보유하고 있습니다 ... bea.stollnitz.com/blog/?p=9
Aaron McIver

2
[wpf ComboBox DisplayMemberPath, SelectedValue 및 SelectedValuePath와 혼동 가능]의 중복 가능성 ( stackoverflow.com/questions/3797034/… )

답변:


552

그들의 이름은 약간 혼란 스러울 수 있습니다 :). 요약은 다음과 같습니다.

  • 하여 selectedItem 속성은 목록이 바인딩되는 전체 개체를 반환합니다. 따라서 Category객체 컬렉션에 목록을 바인딩했다고 가정 합니다 (각 Category 객체에는 Name 및 ID 속성이 있음). 예. ObservableCollection<Category>. 이 SelectedItem속성은 현재 선택된 Category객체를 반환 합니다. 그러나 목적을 결합, 이것은이 그러한 그 같은 목록이 그 범주 객체에 하나의 속성 (의 값이 아닌 바인딩되는 속성에 전체 카테고리 객체를 결합 할 수 있습니다 당신이 원하는 것을 항상없는 ID특성 ).

  • 따라서 대체 바인딩 수단으로 SelectedValuePath 속성과 SelectedValue 속성이 있습니다 (서로와 함께 사용). Product뷰가 바인딩 된 객체 를 가지고 있다고 가정 해 봅시다 (ProductName, Weight 등의 속성 포함). CategoryID해당 Product 개체에 속성이 있고 사용자가 범주 목록에서 제품의 범주를 선택할 수 있기를 원한다고 가정 해 봅시다 . CategoryIDProduct 객체 의 속성에 할당하려면 Category 객체의 ID 속성이 필요 합니다. 이 곳 SelectedValuePathSelectedValue범주 개체의 ID 속성을 목록을 사용하여 바인딩하는 Product 개체의 속성에 할당 SelectedValuePath='ID'한 다음 SelectedValue속성을 DataContext의 속성 (예 : 제품)에 바인딩하도록 지정 합니다.

아래 예제는 이것을 보여줍니다. ComboBox는 ItemsSource를 통해 카테고리 목록에 바인딩되어 있습니다. 제품의 CategoryID 속성을 SelectedValue 속성을 사용하여 선택한 값으로 바인딩합니다. 우리는 이것을 SelectedValuePath 속성을 통해 Category의 ID 속성과 관련시킵니다. 그리고 우리는 DisplayMemberPath 속성과 함께 ComboBox에 Name 속성 만 표시한다고 말합니다.

<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; }
}

처음에는 약간 혼란 스럽지만 희망적으로 조금 더 명확 해집니다 ... :)

크리스


8
설명 주셔서 감사합니다. Silverlight에서 책을 쓴 사람입니까? 내가 당신에게 말하고 있다고 믿지 않습니다. :-) ... 요즘이 책을 읽고 있습니다. 정말 대단한 일입니다. :-)
Nawaz

22
그래, 나야 :). 할 수있을 때 질문에 대답하기 위해 여기에이 부분들을 걸어 놓았습니다. 당신이 책을 즐기고있어서 다행입니다 :). 이 책을 가지고 있으므로 69-70 페이지와 204 페이지에서이 주제에 대한 자세한 정보를 찾을 수 있습니다.
Chris Anderson

8
+1. +100 당신은 각하의 저들 사이에 황금 신입니다. 신의 축복을 빕니다. :) 진지하게, 나는 단지 그것을 알아 내려고 노력하는 데 두 시간을 보냈습니다.
TarkaDaal

1
@Chris Anderson : Product 객체에 CategoryID 대신 Category 속성 (Type Category)이 있으면 어떻게됩니까? 바인딩을 통해 ComboBox 변경시이 Category 속성을 업데이트하려면 어떻게해야합니까?
Lucifer

2
@Lucifer :이 경우 SelectedItem 속성을 다음과 같이 사용합니다. <ComboBox ItemsSource = "{Binding Categories}"SelectedItem = "{Binding Category, Mode = TwoWay}"/> 이것이 도움이되기를 바랍니다.
크리스 앤더슨

69

좀 더 개념적으로 대답하려면 :

SelectedValuePathListBox에 바인딩 된 개체의 이름으로 속성을 ItemsSource항목으로 사용하도록 정의합니다 SelectedValue.

예를 들어, 경우 목록 상자가의 컬렉션에 바인딩되어 Person각각이의 객체 Name, AgeGender속성, SelectedValuePath=Name선택의 가치가 발생합니다 PersonName반환하는 속성을 SelectedValue.

표시 SelectedValuePath할 속성을 지정하는 ListBox의 ControlTemplate을 재정의하거나 스타일을 적용하면 사용할 수 없습니다.

SelectedItem한편, Person현재 선택된 전체 객체를 반환합니다 .

( TreeView를 사용 하는 MSDN의 추가 예 )

업데이트 : @Joe가 지적했듯이 DisplayMemberPath 속성은 Selected * 속성과 관련이 없습니다. 적절한 설명은 다음과 같습니다.

이 값은 DisplayMemberPath(Selector가 아닌 ItemsControl에 정의되어 있음)과는 다르지만 해당 속성은 다음과 유사합니다 SelectedValuePath. 스타일 / 템플릿이없는 경우 항목에 바인딩 된 객체의 속성을 문자열 표현.


8

SelectedItem입니다 object. SelectedValue하고 SelectedValuePath있습니다 string들.

예를 들어 ListBox를 사용하는 경우

말해 주면 listbox1.SelectedValue현재 선택된 항목의 텍스트를 반환합니다.

string value = listbox1.SelectedValue;

당신이 나에게 말 listbox1.SelectedItem한다면 그것은 당신에게 전체 대상을 줄 것입니다.

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

3
SelectedValue또한 object아닙니다 string. Pls 참조 here
john_m

5

이 질문에서 영감을 받아 여기에 코드 스 니펫 과 함께 블로그를 작성했습니다 . 다음은 블로그에서 발췌 한 내용입니다.

SelectedItem – Selected Item은 표시 될 DataSource의 실제 값을 바인딩하는 데 도움이됩니다. 이것은 객체 유형이며이 유형의 객체 유형에서 파생 된 모든 유형을 바인딩 할 수 있습니다. 이 경우 콤보 상자에 MVVM 바인딩을 사용하므로 항목이 선택되었음을 VM에 알리는 데 사용할 수있는 속성입니다.

SelectedValue 및 SelectedValuePath – 콤보 박스에 대해 가장 혼란스럽고 잘못 해석 된 두 가지 속성입니다. 그러나 이러한 속성은 콤보 박스를 이미 생성 된 객체의 값과 바인딩하려고 할 때 구해집니다. 속성에 대한 간단한 아이디어를 얻으려면 다음 목록에서 마지막 시나리오를 확인하십시오.


1

컬렉션을 사용하여 데이터를 저장하는 모든 컨트롤에는 SelectedValue, SelectedItem 속성이 있습니다. 이러한 컨트롤의 예로는 ListBox, Dropdown, RadioButtonList, CheckBoxList가 있습니다.

문자 그대로 선택한 항목의 텍스트를 검색하려는 경우보다 구체적으로 작성하면 다음과 같이 작성할 수 있습니다.

ListBox1.SelectedItem.Text;

값이 이전으로 설정된 경우 SelectedValue 속성을 사용하여 ListBox1에서 Text를 반환 할 수도 있습니다. 그러나 위는 텍스트를 얻는 더 효과적인 방법입니다.

이제이 값은 사용자에게는 보이지 않지만 주로 데이터베이스에 저장하는 데 사용됩니다. ListBox1의 Text는 삽입하지 않지만 삽입 할 수는 있지만 선택한 항목의 값을 삽입하는 데 사용됩니다. 가치를 얻기 위해 우리는 사용할 수 있습니다

ListBox1.SelectedValue

출처

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.