2009-09-16 34 views
10

Mam pole listy, w którym wiążę ItemSource z kolekcją przechowywaną w zestawie obiektu DataContext. Powoduje to wyświetlenie listy przy użyciu funkcji ToString().WPF: Ustaw właściwość wiązania dla wiązania ListBox

<ListBox ItemsSource="{Binding SomeCollection}"></ListBox>      

Teraz chcę wyświetlić właściwość obiektów w kolekcji zamiast. Dlatego chcę zdefiniować szablon itp., Aby to zrobić na wszystkich obiektach na liście powiązanej. Próbowałem różnych podejść bez powodzenia. Chciałbym zrobić coś takiego:

<ListBox ItemsSource="{Binding SomeCollection}"> 
    <ListBox.Template> 
     <ControlTemplate>         
      <ListViewItem Content="{Binding ThePropertyOnElm}"></ListViewItem> 
     </ControlTemplate> 
    </ListBox.Template> 
</ListBox> 

Czy ktoś może mi pomóc to naprawić?

+0

Czy mówisz, że 'ThePropertyOnElm' jest wartością runtime, którą można dynamicznie zmieniać, aby zmienić element wyświetlany na liście? –

+0

Przepraszam, jeśli byłem nieprzydatny. Mam na myśli, że SomeCollection jest ObservableCollection , a MyElm ma właściwość ThePropertyOnElm, którą chcę wyświetlić w ListBox zamiast tego, co funkcja ToString() z MyElm zwraca. – stiank81

Odpowiedz

30

nie trzeba określić szablon, można po prostu użyć właściwości DisplayMemberPath, tak:

<ListBox ItemsSource="{Binding SomeCollection}" DisplayMemberPath="ThePropertyOnElm" /> 

nadzieję, że to pomaga!

2

użyć właściwości wiązania Path:

<ListBox ItemsSource="{Binding SomeCollection}"> 
    <ListBox.Template> 
     <ControlTemplate>         
      <ListViewItem Content="{Binding Path=ThePropertyOnElm}"></ListViewItem> 
     </ControlTemplate> 
    </ListBox.Template> 
</ListBox> 

Uwaga: Przyczyną nieco mylące nazwy (Path) jest to, że może on zostać przedłużony do podrzędnych właściwości itd. Więc jeśli właściwość ThePropertyOnElm Zwraca obiekt z właściwość o nazwie Name, można napisać {Binding Path=ThePropertyOnElm.Name} itp

+0

Nie, to nie pomaga. Tak czy inaczej; Myślałem, że Path jest opcjonalny na prostych powiązaniach takich jak te, w których jedyną rzeczą, którą określasz, jest ścieżka. Stąd twój przykład jest mój. Nie? – stiank81

+0

@ Nie wierzę, że to coś innego niż pytanie zadane w pytaniu. Atrybut 'Path' w' Binding' jest domyślną właściwością treści, co oznacza, że ​​nie musisz podawać go jawnie, tak jak zasugerowałeś.Nie sądzę, aby pierwotne pytanie było bardzo jasne, co jest wymagane. –

+0

Hm tak, oboje macie rację. Poprawiono mnie. –

1

Oto próbka ja niedawno pisał na Code Project:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2006" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
     x:Class="GameSampleApp.Window1" 
     x:Name="Window" 
     Title="Sample App" 
     Width="380" Height="240"> 
     <Window.Resources> 
     <Style TargetType="ListBox"> 
      <Setter Property="Control.FontFamily" Value="Tahoma" /> 
      <Setter Property="Control.FontSize" Value="10" /> 
     </Style> 
     <Style x:Key="FontStyle"> 
      <Setter Property="Control.FontFamily" Value="Verdana" /> 
      <Setter Property="Control.FontStyle" Value="Italic" /> 
      <Setter Property="Control.FontSize" Value="12"/> 
     </Style> 
     <DataTemplate x:Key="GamePersonTemplate"> 
      <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Width="40" Grid.Column="0" Text="{Binding Name, Mode=OneWay}" /> 
      </Grid> 
     </DataTemplate> 
     </Window.Resources> 
     <Grid x:Name="LayoutRoot"> 
     <ListBox Padding="3" HorizontalAlignment="Left" Width="Auto" 
      ItemTemplate="{DynamicResource GamePersonTemplate}" 
      ItemsSource="{Binding}" VerticalAlignment="Top" Height="Auto"/> 
     </Grid> 
    </Window> 

W tej próbce ustawiłem ItemsSource tak, aby wskazywał na wiązanie danych, które może znajdować się w dowolnym miejscu w górze drzewa wizualnego. Szablon elementu jest zdefiniowany w Window.Resources, ale równie dobrze można go zdefiniować w oddzielnym pliku ResourceDictionary. Zasadniczo ten szablon elementów ma wyświetlać pojedynczy blok tekstu dla każdego wiersza elementu, ale w razie potrzeby może być znacznie bardziej skomplikowany; to jest piękno WPF.

10

Myślę, że to, co jesteś chcąc zrobić:

<ListBox ItemsSource="{Binding SomeCollection}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:YourDataType}">         
      <TextBlock Text="{Binding ThePropertyOnElm}" /> 
     </ControlTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Szablon dla ListBox ma zamiar zmodyfikować sposób rzeczywisty listbox wygląda i ItemTemplate będzie kontrolować, jak poszczególne elementy w listbox będzie Popatrz. Zmieniłem szablon kontrolny na DataTemplate i przypisałem go do typu YourDataType. Ponadto użyłem bloku tekstowego w szablonie danych zamiast w polu listboxitem, ponieważ datatemplate jest przypisywane do listboxitem (które powinno zawierać pewien rodzaj treści zamiast innego listboxitem).

Nie próbowałem kompilacji, więc może nie być dokładnie poprawne. jeśli to nie damy mi znać i nie podejmiecie dodatkowych kroków!

+0

Roel uderzył w znak, ale używaj go, jeśli chcesz go bardziej skomplikować, np. Wyświetlając więcej niż jedną właściwość w szablonie. –

+0

To wygląda tak, jak chciałem - dopóki Roel nie dał prostszego, tak. Zachowaj to na później, jeśli potrzebuję zrobić coś bardziej złożonego. Dzięki! – stiank81

Powiązane problemy