En este documento se estudia como extender un control ComboBox, que cargue, y muestre una enumeración al crearse.
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.
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
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
La ventana se muestra por primera vez
Se despliega el Combo
Opción seleccionada
<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>
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |