2009-09-16 9 views
10

J'ai une zone de liste dans laquelle je lie la ItemsSource à une collection stockée dans l'objet DataContext défini. Cela rend la liste affichée en utilisant la fonction ToString().WPF: Définir la propriété de liaison pour la liaison ListBox

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

Maintenant, je souhaite afficher une propriété pour les objets de la collection. Donc, je veux définir un modèle, etc. pour faire cela sur tous les objets de la liste des liens. J'ai essayé une variété d'approches différentes sans succès. Je voudrais faire quelque chose comme ceci:

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

Quelqu'un peut-il m'aider à faire ce droit?

+0

Êtes-vous en train de dire que 'ThePropertyOnElm' est une valeur d'exécution qui peut être changée dynamiquement pour modifier l'élément affiché dans la zone de liste? –

+0

Je suis désolé si j'étais imprécis. Ce que je veux dire est SomeCollection est une ObservableCollection , et MyElm a une propriété ThePropertyOnElm, que je veux être affiché dans le ListBox au lieu de quoi que retourne la fonction ToString() de MyElm. – stiank81

Répondre

30

vous ne avez pas besoin de spécifier un modèle, vous pouvez simplement utiliser la propriété DisplayMemberPath, comme ceci:

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

espérons que cette aide!

2

Utilisez la propriété de liaison Path:

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

Note: La raison du nom quelque peu déroutant (Path) est qu'il peut être étendu à des sous-propriétés, etc. Donc, si la propriété ThePropertyOnElm retourne un objet une propriété appelée Name, vous pouvez écrire {Binding Path=ThePropertyOnElm.Name} etc.

+0

Non, cela n'aide pas. En tous cas; Je pensais que Path était optionnel sur des liaisons simples comme celles-ci où la seule chose que vous spécifiez est le chemin. Par conséquent - votre exemple est égal à moi. Non? – stiank81

+0

@ Pour moi je ne crois pas que ce soit différent de ce qui a été demandé dans la question. L'attribut 'Path' de' Binding' est la propriété de contenu par défaut, ce qui signifie que vous n'avez pas besoin de l'inclure explicitement comme vous l'avez suggéré.Je ne pense pas que la question initiale soit très claire sur ce qui est nécessaire. –

+0

Hm oui, vous avez tous les deux raison. Je me suis trompé. –

1

Voici un exemple que je récemment sur le code du projet:

<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> 

Dans cet exemple, j'ai défini ItemsSource pour pointer vers la liaison datacontext, qui pourrait être n'importe où dans l'arborescence visuelle. Le modèle d'élément est défini dans Window.Resources, mais pourrait tout aussi bien être défini dans un ResourceDictionary séparé. Fondamentalement, ce modèle d'éléments va montrer un bloc de texte unique pour chaque rangée d'article, mais il pourrait être rendu beaucoup plus compliqué si nécessaire; c'est la beauté de WPF.

10

Je pense que c'est ce que vous êtes désireux de faire:

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

Le modèle de ListBox va modifier la façon dont la zone de liste réelle semble, et itemtemplate va contrôler la façon dont les éléments individuels dans la zone de liste sera Regardez. J'ai changé le controltemplate dans un DataTemplate et l'ai assigné au type de YourDataType. En outre, j'ai utilisé un bloc de texte dans le modèle de données au lieu de listboxitem puisque le datatemplate est assigné à listboxitem (qui devrait contenir un certain type de contenu au lieu d'un autre listboxitem).

Je n'ai pas essayé de compiler ceci, donc ce n'est peut-être pas tout à fait correct. si ça ne me laisse pas savoir et mal prendre les mesures supplémentaires!

+0

Roel a frappé la marque, mais utilisez-le si vous avez besoin de le rendre plus compliqué comme l'affichage de plus d'une propriété dans le modèle. –

+0

Cela ressemble à ce que je voulais - jusqu'à ce que Roel a donné le plus simple, oui. Garder cela pour référence ultérieure si je dois faire quelque chose de plus complexe. THX! – stiank81

Questions connexes