Wpf – Extender un control ComboBox que cargue una enumeración

Descripción general

En este documento se estudia como extender un control ComboBox, que cargue, y muestre una enumeración al crearse.

[TOC] Tabla de Contenidos


↑↑↑

Introducción

La forma normal de trabajar es dejar el control ComboBox en la Ventana WPF, y después o bien por código Xaml, o por código subyacente cargar la enumeración que mostrara el control ComboBox.

En este documento lo que se hace es extender un control de forma que en su evento [Loaded] es donde se cargarán los valores.

¿Que se consigue con esto?, pues que al dejarlo en la ventana, el control ComboBox ya tiene sus valores y solo hay que usarlo, no hay que preocupase de la carga :-). Además, al ser un control extendido, se le pueden añadir varias características que nos interesen, como por ejemplo, que me devuelva el valor de la constante enumerada que estamos viendo en el ComboBox.

La forma de hacerlo es sencilla.


↑↑↑

La enumeración

Esta es la enumeración que mostrara el control ComboBox:

Namespace LayerModelo

    ''' <summary>
    '''   Tipos de ordenación posibles de la colección de fotos
    ''' </summary>
    Public Enum OrdenarFotosPorE
        None
        SoloElNombre
        Extension
        NombreMasExtension
        NombreCompleto
        FechaCreacion
        ExifFechaTomaImagen
        ExifEquipoModelo
        ExifEquipoFabricante
        ExifEquipoFabricanteMasModelo
        ExifObjetivo
        ExifVelocidadISO
        ExifVelocidadObturador
        ExifValorApertura
        ExifDistanciaFocal
    End Enum

End Namespace

↑↑↑

El control ComboBox

Namespace LayerVistas.Xhtml.Enumeraciones


    ''' <summary>
    '''  Combo box personalizado que muestra (y permite seleccionar) los valores de la
    '''  enumeración [TargetAtributeValuesEnum] 
    '''  Valores posibles: [_blank, _self, _parent, _top]
    ''' </summary>
    Public Class ComboBoxTargetAtributeValuesEnum
        Inherits System.Windows.Controls.ComboBox


#Region "Constructor"

        Public Sub New()
            MyBase.New
            Call InicializarElComponente()
        End Sub

        Private Sub InicializarElComponente()
            Me.Items.Clear()
            Dim enumeracion As LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum

            For Each texto As String In [Enum].GetNames((enumeracion.GetType))
                Me.AddText(texto)
            Next

            Me.SelectedIndex = 0 ' valor none
            Me.IsEditable = False
        End Sub

#End Region


#Region "Propiedades "

        ''' <summary>
        ''' Un valor de la enumeración [TargetAtributeValuesEnum] [_blank, _self, _parent, _top]
        ''' </summary>
        ''' <value>
        ''' Un valor de enumeración [ETipoDireccion]
        ''' Valores posibles: [_blank, _self, _parent, _top]
        ''' </value>
        Public Property ZValorToCampoEnumerado As LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum
            Get
                ' Obtener el valor de la propiedad SelectedItem. como cadena
                'Dim localValorString As String = CType(ComboBoxAbsolutaRelativa.SelectedItem, String)
                ' Alternativa 
                Dim localValorString As String = CType(Me.SelectedItem, String)
                ' Control de errores para evitar problemas tontos
                If localValorString Is Nothing Then
                    Return LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum._self
                End If



                '    Int index = comboBox1.FindString(textBox2.Text);
                'comboBox1.SelectedIndex = index;

                ' Instanciar una variable enumeración para obtener su tipo (GetType) en la siguiente linea 
                Dim localEnumeracion As LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum

                ' Convertir el texto en una variable de enumeración
                localEnumeracion = CType(System.Enum.Parse(localEnumeracion.GetType, localValorString),
                                         LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum)

                ' Devolver el valor
                Return localEnumeracion
            End Get

            Set(value As LayerModelo.Xhtml.Enumeraciones.TargetAtributeValuesEnum)
                Dim localValorString As String = value.ToString
                Me.SelectedItem = localValorString
            End Set

        End Property


        ''' <summary>
        '''  una cadena que contiene en formato texto un valor de la enumeración que se muestra en el comboBox
        ''' </summary>
        ''' <value>
        ''' una cadena con uno de los valores posibles de la enumeración
        ''' Valores posibles: [_blank, _self, _parent, _top]
        ''' si la cadena buscada no existe [SelectedIndex] toma un valor -1
        ''' </value>
        Public Property ZValorToCadenaSelectedValue As String
            Get
                Return Me.SelectedValue
            End Get
            Set(value As String)
                If String.IsNullOrWhiteSpace(value) = False Then
                    If String.Equals(Me.SelectedValue.ToString.ToLower, value.ToLower) = False Then

                        Dim indice As Integer
                        Dim encontrado As Boolean = False
                        For indice = 0 To Me.Items.Count - 1
                            Dim textoLeido As String = Me.Items(indice)
                            If String.Equals(textoLeido.ToLower, value.ToLower) = True Then
                                encontrado = True
                                Exit For
                            End If
                        Next

                        If encontrado = True Then
                            Me.SelectedValue = value
                        Else
                            Me.SelectedIndex = -1
                        End If

                    End If
                End If
            End Set
        End Property

#End Region


#Region "FindString"


        ''' <summary>
        ''' Devuelve el índice del primer elemento de ComboBox después del índice especificado que contiene la cadena especificada. 
        ''' La búsqueda no hace distinción de mayúsculas y minúsculas.
        ''' </summary>
        ''' <param name=paramTextoBuscado">Objeto String que se va a buscar.</param>"
        ''' <returns>Índice de base cero del primer elemento encontrado; devuelve -1 si no hay coincidencias o 0 si el parámetro [paramTextoBuscado] indica Empty.</returns>
        ''' <remarks>
        ''' La búsqueda realizada por este método no distingue entre mayúsculas y minúsculas.
        ''' El parámetro [paramTextoBuscado] es una subcadena que se va a comparar con el texto asociado a los elementos de la lista del cuadro combinado. 
        ''' La búsqueda realiza una coincidencia parcial a partir del principio del texto y devuelve el primer elemento de la lista que coincide con la subcadena especificada. 
        ''' Si desea realizar una búsqueda de una coincidencia de palabra exacta en lugar de una coincidencia parcial, use el método FindStringExact.
        ''' </remarks>
        Public Function ZFindString(ByVal paramTextoBuscado As String) As Integer
            Return ZFindString(paramTextoBuscado, 0I)
        End Function


        ''' <summary>
        ''' Devuelve el índice del primer elemento de ComboBox después del índice especificado que contiene la cadena especificada. 
        ''' La búsqueda no hace distinción de mayúsculas y minúsculas.
        ''' </summary>
        ''' <param name=paramTextoBuscado">Objeto String que se va a buscar.</param>"
        ''' <param name=paramStartIndex">Índice de base cero del elemento situado delante del primer elemento que se va a buscar. Se establece en -1 para buscar desde el principio del control.</param>"
        ''' <returns>Índice de base cero del primer elemento encontrado; devuelve -1 si no hay coincidencias o 0 si el parámetro [paramTextoBuscado] indica Empty.</returns>
        ''' <exception cref=ArgumentOutOfRangeException"> [ArgumentOutOfRangeException]."
        ''' [paramStartIndex] es menor que -1. O bien 
        ''' [paramStartIndex] es igual que el último índice de la colección.
        ''' </exception>
        ''' <remarks>
        ''' La búsqueda realizada por este método no distingue entre mayúsculas y minúsculas.
        ''' El parámetro [paramTextoBuscado] es una subcadena que se va a comparar con el texto asociado a los elementos de la lista del cuadro combinado. 
        ''' La búsqueda realiza una coincidencia parcial a partir del principio del texto y devuelve el primer elemento de la lista que coincide con la subcadena especificada. 
        ''' Si desea realizar una búsqueda de una coincidencia de palabra exacta en lugar de una coincidencia parcial, use el método FindStringExact.
        ''' </remarks>
        Public Function ZFindString(ByVal paramTextoBuscado As String, ByVal paramStartIndex As Integer) As Integer

            '---------------------------------------
            ' Parámetros
            If paramStartIndex < 0 Then
                Throw New ArgumentOutOfRangeException(NameOf(paramStartIndex), "paramStartIndex es menor que -1")
            End If

            If paramStartIndex >= Me.Items.Count - 1 Then
                Throw New ArgumentOutOfRangeException(NameOf(paramStartIndex), "paramStartIndex es igual o mayor que el numero de elementos de la colección")
            End If
            If String.IsNullOrWhiteSpace(paramTextoBuscado) = True Then
                Return 0I
            End If

            '---------------------------------------
            ' Operación
            Dim resultado As Integer = 0I
            paramTextoBuscado = paramTextoBuscado.ToLower
            Dim textoLeido As String

            Dim encontrado As Boolean = False
            For indice = paramStartIndex To Me.Items.Count - 1
                textoLeido = Me.Items(indice).ToString.ToLower
                If textoLeido.IndexOf(paramTextoBuscado) <> -1 Then
                    encontrado = True
                    resultado = indice
                    Exit For
                End If
            Next

            If encontrado = False Then
                resultado = -1
            End If

            Return resultado
        End Function


        ''' <summary>
        '''  Busca el primer elemento del cuadro combinado que coincide con la cadena especificada.
        ''' </summary>
        ''' <param name=paramTextoBuscado">Objeto String que se va a buscar.</param>"
        ''' <returns>
        '''    Índice de base cero del primer elemento encontrado; 
        '''    devuelve -1 si no hay coincidencias o bien 
        '''    (cero) 0 si el parámetro de entrada es Empty.
        ''' </returns>
        ''' <remarks>
        '''   La búsqueda realizada por este método no distingue entre mayúsculas y minúsculas. 
        '''   El parámetro [paramTextoBuscado] es una cadena que se va a comparar con el texto asociado a 
        '''   los elementos de la lista del cuadro combinado. 
        '''   La búsqueda busca una coincidencia empezando desde el principio del texto y devuelve el 
        '''   primer elemento de la lista que coincide con la subcadena especificada. 
        '''   Si desea realizar una búsqueda de palabras parciales en lugar de una coincidencia de palabra exacta, use el método FindString.
        ''' </remarks>
        Public Function ZFindStringExact(ByVal paramTextoBuscado As String) As Integer
            Return ZFindStringExact(paramTextoBuscado, 0I)
        End Function


        ''' <summary>
        ''' Busca el primer elemento situado detrás del índice dado que coincide con la cadena especificada.
        ''' </summary>
        ''' <param name=paramTextoBuscado">Objeto String que se va a buscar.</param>"
        ''' <param name=paramStartIndex">Índice de base cero del elemento situado delante del primer elemento que se va a buscar. Se establece en -1 para buscar desde el principio del control.</param>"
        ''' <returns>Índice de base cero del primer elemento encontrado; devuelve -1 si no hay coincidencias o 0 si el parámetro [paramTextoBuscado] indica Empty.</returns>
        ''' <exception cref=ArgumentOutOfRangeException"> [ArgumentOutOfRangeException]. [paramStartIndex] es menor que -1. O bien [paramStartIndex] es igual que el último índice de la colección.</exception>"
        ''' <remarks>
        ''' La búsqueda realizada por este método no distingue entre mayúsculas y minúsculas. 
        ''' El parámetro paramTextoBuscado es una cadena que se va a comparar con el texto asociado a los elementos 
        ''' de la lista del cuadro combinado. La búsqueda busca una coincidencia empezando desde el 
        ''' principio del texto y devuelve el primer elemento de la lista que coincide con la subcadena especificada.
        ''' Si desea realizar una búsqueda de palabras parciales en lugar de una coincidencia de palabra exacta, use el método FindString.
        ''' </remarks>
        Public Function ZFindStringExact(ByVal paramTextoBuscado As String, ByVal paramStartIndex As Integer) As Integer
            '---------------------------------------
            ' Parámetros
            If paramStartIndex < 0 Then
                Throw New ArgumentOutOfRangeException(NameOf(paramStartIndex), "paramStartIndex es menor que -1")
            End If

            If paramStartIndex >= Me.Items.Count - 1 Then
                Throw New ArgumentOutOfRangeException(NameOf(paramStartIndex), "paramStartIndex es igual o mayor que el numero de elementos de la colección")
            End If
            If String.IsNullOrWhiteSpace(paramTextoBuscado) = True Then
                Return 0I
            End If

            '---------------------------------------
            ' Operación
            Dim resultado As Integer = 0I
            Dim encontrado As Boolean = False
            Dim textoLeido As String

            If String.IsNullOrWhiteSpace(paramTextoBuscado) = False Then
                paramTextoBuscado = paramTextoBuscado.ToLower

                For indice As Integer = paramStartIndex To Me.Items.Count - 1
                    textoLeido = Me.Items(indice).ToString.ToLower
                    If String.Equals(textoLeido, paramTextoBuscado) = True Then
                        encontrado = True
                        resultado = indice
                        Exit For
                    End If
                Next
                If encontrado = False Then
                    resultado = -1
                End If
            End If
            Return resultado
        End Function

#End Region


    End Class

End Namespace


↑↑↑

Imágenes


la ventana se muestra por primera vez

La ventana se muestra por primera vez


Se despliega el Combo

Se despliega el Combo


Opción seleccionada

Opción seleccionada



↑↑↑

Codigo xaml de las imagenes

<Window x:Class="Window03"
        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/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfPruebasMenuItem"
        mc:Ignorable="d"
        Title="Window03" Height="150" Width="300">


    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0"
               Content="Con el evento" HorizontalAlignment="Left"  VerticalAlignment="Top"/>

        <TextBox Grid.Row="0"  Grid.Column="1" x:Name="textBoxResultado" 
                 HorizontalAlignment="Left" VerticalAlignment="Center" 
                 Height="23" Width="180"
                 TextWrapping="Wrap" Text="TextBox" />

        <Label Grid.Row="1" Grid.Column="0"
               Content="Binding Text" HorizontalAlignment="Left"  VerticalAlignment="Top"/>

        <TextBox Grid.Row="1" Grid.Column="1"  x:Name="textBoxResultadoEnlazadoText" 
                 HorizontalAlignment="Left" VerticalAlignment="Center" 
                 Height="23" Width="180"
                 TextWrapping="Wrap" Text="{Binding Text, ElementName=MyComboBoxOrdenarFotos}" />

        <Label Grid.Row="2" Grid.Column="0"
               Content="Binding SelectedItem" HorizontalAlignment="Left"  VerticalAlignment="Top"/>

        <TextBox Grid.Row="2"  Grid.Column="1" x:Name="textBoxResultadoEnlazadoSelectionChanged" 
                 HorizontalAlignment="Left" VerticalAlignment="Center" 
                 Height="23" Width="180"
                 TextWrapping="Wrap" Text="{Binding SelectedItem, ElementName=MyComboBoxOrdenarFotos}" />


        <local:ComboBoxOrdenarFotos  Grid.Row="3"  Grid.ColumnSpan="2" x:Name="MyComboBoxOrdenarFotos" 
                                     Width="180"
                                     HorizontalAlignment="Left" VerticalAlignment="Center"                                 
                                     SelectionChanged="MyComboBoxOrdenarFotos_SelectionChanged"/>

    </Grid>
</Window>

↑↑↑

A.2.Enlaces

[Para saber mas]
Wpf – Cargar en un ListBox una enumeración del sistema
Wpf – Cargar en un ListBox/ComboBox una enumeración creada por nosotros
Wpf – Cargar una colección en una enumeración
Wpf – Extender un control ComboBox que cargue una enumeración (Este documento)
Wpf – ComboBox.SelectionChanged
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]