WPF Combobox DisplayMemberPath

Ok, przejrzałem inne pytania i nie dostałem odpowiedzi, więc mam nadzieję, że ktoś tutaj może.

Bardzo proste pytanie dlaczego właściwość DisplayMemberPath nie jest powiązana z elementem?

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

Wyjście śledzenia pokazuje, że próbuje powiązać z klasą posiadającą IEnumerable, a nie rzeczywistą pozycję w IEnumerable. Jestem zdezorientowany co do prostego sposobu wypełnienia comboboxu bez dodawania kilku linii a w xaml.

Po prostu wywołuje ToString () dla obiektu w itemssource. Mam pracę wokół której jest to:

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}"  SelectedItem="{Binding Prompt}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Ale moim zdaniem to za dużo jak na tak proste zadanie. Czy mogę użyć wiązania relativesource?
Author: Jose, 2009-09-22

5 answers

DisplayMemberPath określa ścieżkę do właściwości display string dla każdego elementu. W Twoim przypadku ustawiłbyś to na "Name", a nie "{Binding Name}".

 125
Author: Ben M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-22 15:00:38

Nie jesteś związany z danymi w klasie, mówisz jej, aby pobrała dane od członka klasy, który jest nazwany przez członka "name", więc jeśli twoja instancja mA item.Name == "steve", próbuje pobrać dane z item.steve.

Aby to zadziałało, powinieneś usunąć Wiązanie ze ścieżki członkowskiej. Zmień go na MemberPath = "Name" to mówi mu, aby pobierał dane z członka "Name". W ten sposób wywoła item.Name, a nie item.steve.

 7
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 12:03:25

Możesz usunąć DisplayMemberPath, a następnie ustawić ścieżkę w bloku tekstowym.
DisplayMemberPath jest naprawdę dla, gdy nie masz ItemTemplate.
Możesz też usunąć ItemTemplate i użyć DisplayMemberPath - w takim przypadku zasadniczo tworzy dla Ciebie blok tekstowy. Nie polecam robić obu.

   <TextBlock text="{Binding Path=Name, Mode=OneWay}" 
 5
Author: paparazzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 17:20:55

Należy zmienić MemberPath="{Binding Name}" na MemberPath="Name". Wtedy zadziała.

 5
Author: Emu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 12:05:12

Alternatywnie nie musisz ustawiać ścieżki DisplayMemberPath. możesz po prostu dodać nadpisanie ToString () do obiektu, który znajduje się na liście monitów. tak:

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

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

Funkcja ToString() zostanie automatycznie wywołana i wyświetli parametr Name Z twojej klasy. działa to dla Comboboxów, Listboxów itp.

 2
Author: JJ_Coder4Hire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-18 20:03:28