2009-09-16 21 views
10

Tengo un listbox donde enlazo el ItemsSource a una colección almacenada en el objeto DataContext establecido. Esto hace que la lista se muestre con la función ToString().WPF: Establecer propiedad de enlace para ListBox-binding

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

Ahora quiero mostrar una propiedad para los objetos de la colección. Así que quiero definir una plantilla, etc. para hacer esto en todos los objetos de la lista encuadernada. Probé una variedad de enfoques diferentes sin éxito. Me gustaría hacer algo como esto:

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

Puede alguien ayudarme a hacer este derecho?

+0

¿Está diciendo que 'ThePropertyOnElm' es un valor de tiempo de ejecución que podría cambiarse dinámicamente para modificar qué elemento se muestra en el cuadro de lista? –

+0

Lo siento si no fui preciso. Lo que quiero decir es SomeCollection es un ObservableCollection , y MyElm tiene una propiedad ThePropertyOnElm, que quiero que se muestre en el ListBox en lugar de lo que devuelva la función ToString() de MyElm. – stiank81

Respuesta

30

que no es necesario especificar una plantilla, sólo puede utilizar la propiedad DisplayMemberPath, así:

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

esperanza que esto ayude!

2

Use la propiedad de enlace Ruta:

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

Nota: La razón del nombre algo confuso (Path) es que puede extenderse a subpropiedades etc Por lo tanto, si la propiedad ThePropertyOnElm devuelve un objeto con una propiedad llamada Name, se podría escribir {Binding Path=ThePropertyOnElm.Name} etc.

+0

No, eso no ayuda. De todas formas; Pensé que Path era opcional en enlaces simples como estos, donde lo único que especifica es el camino. Por lo tanto, tu ejemplo es igual al mío. ¿No? – stiank81

+0

@Tor No creo que esto sea diferente de lo que se preguntó en la pregunta. El atributo 'Path' de' Binding' es la propiedad de contenido predeterminada, lo que significa que no tiene que incluirlo explícitamente como ha sugerido.Sin embargo, no creo que la pregunta original sea muy clara sobre lo que se requiere. –

+0

Hm sí, ambos tienen razón. Estoy corregido. –

1

he aquí una muestra recientemente he publicado en Proyecto Código:

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

En esta muestra, configuré el ItemsSource para que apunte al enlace del contexto de datos, que podría estar en cualquier parte del árbol visual. La plantilla del elemento se define en la Ventana. Recursos, pero también podría definirse en un ResourceDictionary por separado. Básicamente, esta plantilla de elementos mostrará un solo bloque de texto para cada fila de elementos, pero podría ser mucho más complicado si fuera necesario; esa es la belleza de WPF.

10

Creo que esto es lo que usted está queriendo hacer:

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

la plantilla para el cuadro de lista se va a modificar el aspecto del cuadro de lista actual, y itemtemplate va a controlar cómo los elementos individuales en el cuadro de lista se Mira. Cambié el controltemplate en un DataTemplate y lo asigné al tipo de YourDataType. Además, utilicé un bloque de texto dentro de la plantilla de datos en lugar de listboxitem ya que la plantilla de datos se está asignando a listboxitem (que debe contener algún tipo de contenido en lugar de otro listboxitem).

no he intentado compilar esto por lo que podría no ser exactamente correcto. ¡si no me lo deja saber y tomaré los pasos adicionales!

+0

Roel da en el blanco, pero úsala si terminas necesitando complicarla más, como mostrar más de una propiedad en la plantilla. –

+0

Esto se ve como lo que quería, hasta que Roel dio el más simple, sí. Mantengo esto para referencia futura si necesito hacer algo más complejo. ¡Gracias! – stiank81

Cuestiones relacionadas