source

WPF 콤보 상자 디스플레이 구성원 경로

manycodes 2023. 5. 1. 21:33
반응형

WPF 콤보 상자 디스플레이 구성원 경로

네, 다른 질문들을 봤는데 답을 못 받아서 여기 계신 분들이 그러셨으면 좋겠네요.

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

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

추적 출력은 IEnumberable의 실제 항목이 아닌 IEnumberable을 보유하는 클래스에 바인딩하려고 시도하고 있음을 보여줍니다.xaml에 줄을 한 번도 추가하지 않고 콤보 박스를 채우는 간단한 방법이 헷갈립니다.

단순히 항목 소스의 개체에 대한 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}".

클래스의 데이터에 바인딩되어 있지 않습니다. 멤버 "이름"에 의해 이름이 지정된 클래스 멤버로부터 데이터를 가져오라고 하는 것입니다. 따라서 인스턴스가item.Name == "steve"그것은 데이터를 얻으려고 노력하고 있습니다.item.steve.

이 작업을 수행하려면 MemberPath에서 바인딩을 제거해야 합니다.로 변경MemberPath = "Name"이것은 멤버 "이름"으로부터 데이터를 가져오라고 말합니다.그렇게 부르면 됩니다.item.Name,것은 아니다.item.steve.

변경해야 합니다.MemberPath="{Binding Name}"로.MemberPath="Name"그러면 효과가 있을 겁니다.

DisplayMemberPath를 제거한 다음 TextBlock에서 경로를 설정할 수 있습니다.
DisplayMemberPath는 ItemTemplate가 없을 때 사용합니다.
또는 ItemTemplate를 제거하고 DisplayMemberPath를 사용할 수 있습니다. 이 경우 기본적으로 텍스트 블록이 만들어집니다.둘 다 하는 것은 추천하지 않습니다.

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

또는 DisplayMemberPath를 설정할 필요가 없습니다. PromptList에 있는 개체에 재정의 ToString()을 포함하면 됩니다.다음과 같이:

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

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

ToString()이 자동으로 호출되고 클래스의 Name 매개 변수가 표시됩니다.ComboBox, ListBox 등에 사용할 수 있습니다.

시도:

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

제가 아는 바로는

"DisplayMemberPath"는 반사를 사용하여 데이터 컨텍스트 클래스에서 속성 이름을 가져올 수 없으면 아무것도 표시되지 않습니다.

if 클래스

class some_class{
  string xxx{ get; }
}

DisplayMemberPath=xxx. 값 "xxx"가 무엇인지 표시합니다.

데이터 컨텍스트에서 속성을 연결하려면 항목 템플릿을 만들어야 합니다. 이 템플릿은 머리글과 드롭다운 목록에 표시됩니다.

<ComboBox.ItemTemplate>
          <DataTemplate DataType="employee">
            <StackPanel Orientation="Horizontal">
              <TextBlock Text="{Binding first_name}" />
              <TextBlock Text="" />
              <TextBlock Text="{Binding last_name}" />
            </StackPanel>
          </DataTemplate>
        </ComboBox.ItemTemplate>

"DisplayMemberPath" 및 "ComboBox"를 사용할 수 없습니다.항목 템플릿"이 동시에 설정됩니다.

언급URL : https://stackoverflow.com/questions/1460612/wpf-combobox-displaymemberpath

반응형