Información general sobre ListView

El control ListView proporciona la infraestructura para mostrar un conjunto de elementos de datos usando un diseño o vista distinto. Por ejemplo, es posible que un usuario quiera mostrar elementos de datos en una tabla y, además, ordenar las columnas.

Nota

Los tipos a los que se hace referencia en este artículo están disponibles en la sección Referencia de código.

¿Qué es ListView?

La clase ListView se deriva de la clase ListBox. Habitualmente, sus elementos son miembros de una recopilación de datos y se representan como objetos ListViewItem. Un objeto ListViewItem es un ContentControl y solo puede contener un único elemento secundario. Sin embargo, el elemento secundario puede ser cualquier elemento visual.

Definición de un modo de vista para ListView

Para especificar un modo de vista para un control ListView, establezca la propiedad View. Un modo de vista que proporciona Windows Presentation Foundation (WPF) es GridView, que muestra una colección de elementos de datos en una tabla con columnas personalizables.

En el ejemplo siguiente se muestra cómo definir un GridView para un control ListView que muestra información sobre empleados.


<ListView ItemsSource="{Binding Source={StaticResource EmployeeInfoDataSource}}">

    <ListView.View>

        <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Employee Information">

            <GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" Header="First Name" Width="100"/>

            <GridViewColumn DisplayMemberBinding="{Binding Path=LastName}" Width="100">
                <GridViewColumnHeader>Last Name
                    <GridViewColumnHeader.ContextMenu>
                        <ContextMenu MenuItem.Click="LastNameCM_Click" Name="LastNameCM">
                            <MenuItem Header="Ascending" />
                            <MenuItem Header="Descending" />
                        </ContextMenu>
                    </GridViewColumnHeader.ContextMenu>
                </GridViewColumnHeader>
            </GridViewColumn>

            <GridViewColumn DisplayMemberBinding="{Binding Path=EmployeeNumber}" Header="Employee No." Width="100"/>
        </GridView>

    </ListView.View>
</ListView>

En la ilustración siguiente se muestra cómo aparecen los datos en el ejemplo anterior.

Captura de pantalla que muestra un control ListView con salida GridView.

Puede crear un modo de vista personalizada si define una clase que hereda de la clase ViewBase. La clase ViewBase proporciona la infraestructura que se necesita para crear una vista personalizada. Para más información sobre cómo crear una vista personalizada, consulte Creación de un modo de vista personalizada para un control ListView.

Enlace de datos a un control ListView

Use las propiedades Items y ItemsSource para especificar elementos para un control ListView. En el siguiente ejemplo, se establece la propiedad ItemsSource para una recopilación de datos llamada EmployeeInfoDataSource.

<ListView ItemsSource="{Binding Source={StaticResource EmployeeInfoDataSource}}">

En un GridView, los objetos GridViewColumn se enlazan a los campos de datos especificados. En el ejemplo siguiente se enlaza un objeto GridViewColumn a un campo de datos especificando un Binding para la propiedad DisplayMemberBinding.

GridViewColumn gvc1 = new GridViewColumn();
gvc1.DisplayMemberBinding = new Binding("FirstName");
gvc1.Header = "FirstName";
gvc1.Width = 100;
Dim gvc1 As New GridViewColumn()
gvc1.DisplayMemberBinding = New Binding("FirstName")
gvc1.Header = "FirstName"
gvc1.Width = 100
<GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" Header="First Name" Width="100"/>

También puede especificar un Binding como parte de una definición DataTemplate que utilice para dar estilo a las celdas de una columna. En el ejemplo siguiente, el DataTemplate que se identifica con un objeto ResourceKey establece el Binding para GridViewColumn. Tenga en cuenta que este ejemplo no define el DisplayMemberBinding porque tiene prioridad sobre CellTemplate.

<DataTemplate x:Key="myCellTemplateMonth">
  <DockPanel>
    <TextBlock Foreground="DarkBlue" HorizontalAlignment="Center">
      <TextBlock.Text>
        <Binding Path="Month"/>
      </TextBlock.Text>
    </TextBlock>
  </DockPanel>
</DataTemplate>
<GridViewColumn Header="Month" Width="80"
      CellTemplate="{StaticResource myCellTemplateMonth}"/>

Aplicación de un estilo a un control ListView que implementa GridView

El control ListView contiene ListViewItem objetos, que representan los elementos de datos que se muestran. Puede usar las propiedades siguientes para definir el contenido y el estilo de los elementos de datos:

Para evitar problemas de alineación entre celdas en una GridView, no use ItemContainerStyle para establecer las propiedades o añadir contenido que afecte a la anchura de un elemento en un ListView. Podría producirse un problema de alineación cuando establece la propiedad Margin en ItemContainerStyle, por ejemplo. Para especificar las propiedades o definir el contenido que afecta a la anchura de los elementos en GridView, use las propiedades de la clase GridView y sus clases relacionadas, como GridViewColumn.

Para más información sobre cómo usar GridView y sus clases compatibles, consulte Información general sobre GridView.

Si define un ItemContainerStyle para un control ListView y también define un ItemTemplate, debe incluir un ContentPresenter en el estilo para que ItemTemplate funcione correctamente.

No use las propiedades HorizontalContentAlignment yVerticalContentAlignment para el contenido ListView que se muestra por un GridView. Para especificar la alineación del contenido de una columna de GridView, defina CellTemplate.

Uso compartido del mismo modo de vista

Dos controles ListView no pueden compartir el mismo modo de vista al mismo tiempo. Si intenta usar el mismo modo de vista con más de un control ListView, se genera una excepción.

Para especificar un modo de vista que más de un control ListView pueda usar simultáneamente, use las plantillas o los estilos.

Creación de un modo de vista personalizado

Las vistas personalizadas como GridView derivan de la clase abstracta ViewBase, que proporciona las herramientas para mostrar los elementos de datos que se representan como objetos ListViewItem.

Referencia de código

En este artículo se hace referencia a los siguientes objetos:

  • Recopilación de datos EmployeeInfoDataSource. Si usa Visual Basic .NET, el elemento Window se declara de forma ligeramente diferente de como se ve en le ejemplo de código:

    <Window x:Class="SDKSample.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="OnLoad"
            xmlns:ds="clr-namespace:SDKSample">
    
        <Window.Resources>
            <ObjectDataProvider x:Key="EmployeeInfoDataSource" ObjectType="{x:Type ds:myEmployees}" />
        </Window.Resources>
    
  • Clase EmployeeInfo, que se usa como tipo para la colección de datos EmployeeInfoDataSource.

    public class EmployeeInfo
    {
        private string _firstName;
        private string _lastName;
        private string _employeeNumber;
    
        public string FirstName
        {
            get {return _firstName;}
            set {_firstName = value;}
        }
    
        public string LastName
        {
            get {return _lastName;}
            set {_lastName = value;}
        }
    
        public string EmployeeNumber
        {
            get {return _employeeNumber;}
            set {_employeeNumber = value;}
        }
    
        public EmployeeInfo(string firstname, string lastname, string empnumber)
        {
            _firstName = firstname;
            _lastName = lastname;
            _employeeNumber = empnumber;
        }
    }
    
    Public Class EmployeeInfo
        Private _firstName As String
        Private _lastName As String
        Private _employeeNumber As String
    
        Public Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property
    
        Public Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property
    
        Public Property EmployeeNumber() As String
            Get
                Return _employeeNumber
            End Get
            Set(ByVal value As String)
                _employeeNumber = value
            End Set
        End Property
    
        Public Sub New(ByVal firstname As String, ByVal lastname As String, ByVal empnumber As String)
            _firstName = firstname
            _lastName = lastname
            _employeeNumber = empnumber
        End Sub
    End Class
    

Vea también