2009-09-22 6 views
40

좋아, 나는 다른 질문을 보았으므로 내 대답을 얻지 못한 것 같아 여기 누군가가 할 수 있기를 바랍니다.WPF Combobox DisplayMemberPath

DisplayMemberPath 속성이 항목에 바인딩되지 않는 이유는 무엇입니까?

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

추적 출력은 IEnumerable의 실제 항목이 아니라 IEnumerable을 보유한 클래스에 바인딩하려고한다는 것을 나타냅니다. xaml에 줄을 추가하지 않고 콤보 상자를 채울 수있는 간단한 방법은 혼란 스럽습니다.

단순히 itemsSource의 개체에 대해 ToString()을 호출합니다. 나는이 주위에있는 작품을 가지고 :

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

그러나 제 의견으로는 너무 간단한 작업입니다. 친척 소스 바인딩을 사용할 수 있습니까?

답변

115

은 각 항목의 표시 문자열 속성에 대한 경로를 지정합니다. 귀하의 경우에는 "{Binding Name}"이 아니라 "Name"으로 설정하십시오.

+0

당신은 절대적으로 놀랍습니다. 나는 분명히 놓쳤습니다. – Jose

+0

도와 드리겠습니다! (SO를 만족시키기위한 약간의 패딩 포함) –

+0

같은 문제가 있습니다. 고마워요. 다시 구조 대원에게! –

7

클래스의 데이터에 바인딩하지 않고 "name"멤버의 이름을 가진 클래스 멤버로부터 데이터를 가져 오도록 말하고 있으므로 인스턴스에 item.Name == "steve"이 있으면 데이터를 가져 오려고합니다 item.steve에서

이 작업을 수행하려면 MemberPath에서 바인딩을 제거해야합니다. 이것을 MemberPath = "Name"으로 변경하면 구성원 "이름"에서 데이터를 가져 오도록 지시합니다. 그러면 item.Name이 아니라 item.steve이됩니다.

5

MemberPath="{Binding Name}"MemberPath="Name"으로 변경해야합니다. 그 때 그것은 작동 할 것이다.

5

DisplayMemberPath를 제거한 다음 TextBlock에서 경로를 설정할 수 있습니다.
DisplayMemberPath는 실제로 ItemTemplate이없는 경우를위한 것입니다.
또는 ItemTemplate을 제거하고 DisplayMemberPath를 사용할 수 있습니다.이 경우 기본적으로 TextBlock이 자동으로 만들어집니다. 둘 다 권장하지 않습니다.

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

또는 DisplayMemberPath를 설정할 필요가 없습니다. PromptList에있는 개체에 ToString() 재정의를 포함 할 수 있습니다. 이렇게 :

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

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

ToString()은 자동으로 호출되어 클래스의 Name 매개 변수를 표시합니다. ComboBoxes, ListBoxes 등에서 작동합니다.

+5

이것은 좋은 해결책이 아닙니다. ToString()은 기본 및 대체 전략이며 정보를 GUI로 가져 오는 표준이 아닙니다. –