2009-09-22 8 views
40

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

Bardzo proste pytanie, dlaczego właściwość DisplayMemberPath nie wiąże się z przedmiotem?

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

Wyjście ślad pokazuje, że stara się wiązać z klasą posiadającą nie IEnumerable rzeczywista pozycja w IEnumerable. Jestem zdezorientowany, jeśli chodzi o prosty sposób wypełniania combobox bez dodawania kilka linii w Xaml.

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

<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 zbyt dużo dla tak prostego zadania. Czy mogę użyć wiązania powiązań?

Odpowiedz

115

DisplayMemberPath określa ścieżkę do właściwości łańcucha wyświetlania dla każdej pozycji. W twoim przypadku ustawisz go na "Name", a nie "{Binding Name}".

+0

jesteś absolutnie niesamowita, nie mogę uwierzyć, że przegapiłem oczywistość. – Jose

+0

cieszę się, że mogę pomóc! (z pewnym wypełnieniem, aby spełnić SO) –

+0

Ten sam problem tutaj. Dzięki Ci - TO na ratunek ponownie! –

7

Nie są wiążące dla danych w klasie, mówisz, aby uzyskać jego dane od członka klasy, który jest nazwany przez członka "nazwa", więc jeśli twoja instancja ma item.Name == "steve" próbuje uzyskać dane od item.steve.

Aby to działało, należy usunąć powiązanie z obiektu MemberPath. Zmień go na MemberPath = "Name", dzięki czemu uzyska dane od członka "Nazwa". W ten sposób zadzwoni item.Name, a nie item.steve.

5

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

5

Można usunąć DisplayMemberPath, a następnie ustawić ścieżkę w TextBlock.
DisplayMemberPath sprawdza się, gdy nie masz ItemTemplate.
Możesz też usunąć ItemTemplate i używać DisplayMemberPath - w takim przypadku tworzy on dla Ciebie TextBlock. Nie polecam, robisz jedno i drugie.

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

Alternatywnie nie trzeba ustawiać DisplayMemberPath. możesz po prostu dołączyć przesłonięcie ToString() w twoim obiekcie, który jest w twoim PromptList. 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 Nazwa ze swojej klasy. działa to dla ComboBox, ListBox, itp.

+5

To nie jest dobre rozwiązanie. ToString() jest tylko strategią domyślną i awarią, a nie standardem do przekazywania informacji do GUI. –