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]