차이점은 다음과 같습니다.
이러한 모든 종속성 속성은 Selector 클래스에 정의되어 있습니다. 나는 종종 혼동 SelectedItem
으로 SelectedValue
하고 SelectedValue
와 SelectedValuePath
.
나는 그들 사이의 차이점을 알고 싶습니다. 또한 언제 SelectedValue
그리고 특히 언제 사용합니까 SelectedValuePath
? 간단한 예제를 통해 사용법 을 설명하십시오 .
답변
그들의 이름은 약간 혼란 스러울 수 있습니다 :). 요약은 다음과 같습니다.
-
하여 selectedItem 속성은 목록이 바인딩되는 전체 개체를 반환합니다. 따라서
Category
객체 컬렉션에 목록을 바인딩했다고 가정 합니다 (각 Category 객체에는 Name 및 ID 속성이 있음). 예.ObservableCollection<Category>
. 이SelectedItem
속성은 현재 선택된Category
객체를 반환 합니다. 그러나 목적을 결합, 이것은이 그러한 그 같은 목록이 그 범주 객체에 하나의 속성 (의 값이 아닌 바인딩되는 속성에 전체 카테고리 객체를 결합 할 수 있습니다 당신이 원하는 것을 항상없는ID
특성 ). -
따라서 대체 바인딩 수단으로 SelectedValuePath 속성과 SelectedValue 속성이 있습니다 (서로와 함께 사용).
Product
뷰가 바인딩 된 객체 를 가지고 있다고 가정 해 봅시다 (ProductName, Weight 등의 속성 포함).CategoryID
해당 Product 개체에 속성이 있고 사용자가 범주 목록에서 제품의 범주를 선택할 수 있기를 원한다고 가정 해 봅시다 .CategoryID
Product 객체 의 속성에 할당하려면 Category 객체의 ID 속성이 필요 합니다. 이 곳SelectedValuePath
은SelectedValue
범주 개체의 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; }
}
처음에는 약간 혼란 스럽지만 희망적으로 조금 더 명확 해집니다 … 🙂
크리스
답변
좀 더 개념적으로 대답하려면 :
SelectedValuePath
ListBox에 바인딩 된 개체의 이름으로 속성을 ItemsSource
항목으로 사용하도록 정의합니다 SelectedValue
.
예를 들어, 경우 목록 상자가의 컬렉션에 바인딩되어 Person
각각이의 객체 Name
, Age
및 Gender
속성, SelectedValuePath=Name
선택의 가치가 발생합니다 Person
의 Name
반환하는 속성을 SelectedValue
.
표시 SelectedValuePath
할 속성을 지정하는 ListBox의 ControlTemplate을 재정의하거나 스타일을 적용하면 사용할 수 없습니다.
SelectedItem
한편, Person
현재 선택된 전체 객체를 반환합니다 .
( TreeView를 사용 하는 MSDN의 추가 예 )
업데이트 : @Joe가 지적했듯이 DisplayMemberPath 속성은 Selected * 속성과 관련이 없습니다. 적절한 설명은 다음과 같습니다.
이 값은 DisplayMemberPath
(Selector가 아닌 ItemsControl에 정의되어 있음)과는 다르지만 해당 속성은 다음과 유사합니다 SelectedValuePath
. 스타일 / 템플릿이없는 경우 항목에 바인딩 된 객체의 속성을 문자열 표현.
답변
SelectedItem
입니다 object
.
SelectedValue
하고 SelectedValuePath
있습니다 string
들.
예를 들어 ListBox를 사용하는 경우
말해 주면 listbox1.SelectedValue
현재 선택된 항목의 텍스트를 반환합니다.
string value = listbox1.SelectedValue;
당신이 나에게 말 listbox1.SelectedItem
한다면 그것은 당신에게 전체 대상을 줄 것입니다.
ListItem item = listbox1.SelectedItem;
string value = item.value;
답변
이 질문에서 영감을 받아 여기에 코드 스 니펫 과 함께 블로그를 작성했습니다 . 다음은 블로그에서 발췌 한 내용입니다.
SelectedItem – Selected Item은 표시 될 DataSource의 실제 값을 바인딩하는 데 도움이됩니다. 이것은 객체 유형이며이 유형의 객체 유형에서 파생 된 모든 유형을 바인딩 할 수 있습니다. 이 경우 콤보 상자에 MVVM 바인딩을 사용하므로 항목이 선택되었음을 VM에 알리는 데 사용할 수있는 속성입니다.
SelectedValue 및 SelectedValuePath – 콤보 박스에 대해 가장 혼란스럽고 잘못 해석 된 두 가지 속성입니다. 그러나 이러한 속성은 콤보 박스를 이미 생성 된 객체의 값과 바인딩하려고 할 때 구해집니다. 속성에 대한 간단한 아이디어를 얻으려면 다음 목록에서 마지막 시나리오를 확인하십시오.
답변
컬렉션을 사용하여 데이터를 저장하는 모든 컨트롤에는 SelectedValue, SelectedItem 속성이 있습니다. 이러한 컨트롤의 예로는 ListBox, Dropdown, RadioButtonList, CheckBoxList가 있습니다.
문자 그대로 선택한 항목의 텍스트를 검색하려는 경우보다 구체적으로 작성하면 다음과 같이 작성할 수 있습니다.
ListBox1.SelectedItem.Text;
값이 이전으로 설정된 경우 SelectedValue 속성을 사용하여 ListBox1에서 Text를 반환 할 수도 있습니다. 그러나 위는 텍스트를 얻는 더 효과적인 방법입니다.
이제이 값은 사용자에게는 보이지 않지만 주로 데이터베이스에 저장하는 데 사용됩니다. ListBox1의 Text는 삽입하지 않지만 삽입 할 수는 있지만 선택한 항목의 값을 삽입하는 데 사용됩니다. 가치를 얻기 위해 우리는 사용할 수 있습니다
ListBox1.SelectedValue