code

WPF 콤보 상자 DisplayMemberPath

codestyles 2020. 12. 14. 08:12
반응형

WPF 콤보 상자 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>

그러나 제 생각에는 그렇게 간단한 작업에는 너무 많은 것입니다. 상대 소스 바인딩을 사용할 수 있습니까?


DisplayMemberPath각 항목의 표시 문자열 속성에 대한 경로를 지정합니다. 귀하의 경우에는, 당신은으로 설정 것 "Name",하지 "{Binding Name}".


클래스의 데이터에 바인딩하는 것이 아니라 멤버 "name"으로 명명 된 클래스 멤버에서 데이터를 가져 오도록 지시하는 것이므로 인스턴스에있는 경우 item.Name == "steve"에서 데이터를 가져 오려고합니다 item.steve.

이 작업을 수행하려면 MemberPath에서 바인딩을 제거해야합니다. 이를 변경 MemberPath = "Name"하면 멤버 "Name"에서 데이터를 가져 오도록 지시합니다. 그렇게하면 전화 item.Name가 아니라 전화를 겁니다 item.steve.


DisplayMemberPath를 제거한 다음 TextBlock에서 경로를 설정할 수 있습니다.
DisplayMemberPath는 실제로 ItemTemplate이 없을 때 사용됩니다.
또는 ItemTemplate을 제거하고 DisplayMemberPath를 사용할 수 있습니다.이 경우 기본적으로 TextBlock이 생성됩니다. 두 가지 모두 권장하지 않습니다.

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

당신은 변경해야합니다 MemberPath="{Binding Name}"에를 MemberPath="Name". 그러면 작동합니다.


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

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

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

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

참고 URL : https://stackoverflow.com/questions/1460612/wpf-combobox-displaymemberpath

반응형