es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cancelar la selección en “Drop Down”?

Cuando se introduce un valor en el ComboBox y se hace clic en el botón Desplegar, se seleccionará todo el texto.

¿Cómo podría eliminar este efecto o cancelar la selección después de hacer clic en el botón Desplegar?

La forma que conozco es restablecer “CaretIndex”.

var cmbTextBox = (TextBox)com.Template.FindName("PART_EditableTextBox", com);
cmbTextBox.CaretIndex = com.Text.Length;

Quiero saber si hay alguna solución que utilice “Binding” (MVVM) para lograrlo, en lugar de acceder a la instancia de ComboBox.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser crear un control ComboBox personalizado y anular su plantilla para vincular la propiedad CaretIndex del TextBox interno a una propiedad en el ViewModel. De esta manera, puede manejar la lógica de restablecimiento de CaretIndex en el ViewModel, sin tener que acceder a la instancia del ComboBox.

    Aquí están los pasos para lograrlo:

    1. Cree un nuevo control que herede de ComboBox:
    public class CustomComboBox : ComboBox
    {
        static CustomComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomComboBox), new FrameworkPropertyMetadata(typeof(CustomComboBox)));
        }
    }
    
    1. Cree un estilo predeterminado para el control y anule su plantilla para vincular la propiedad CaretIndex del TextBox interno:
    <style targettype="{x:Type local:CustomComboBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomComboBox}">
                    <Grid>
                        <TextBox x:Name="PART_EditableTextBox"
                                 Text="{Binding Path=Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                                 CaretIndex="{Binding Path=CaretIndex, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
                        <Popup x:Name="PART_Popup" IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
                            ...
                        </Popup>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </style>
    
    1. En su ViewModel, cree una propiedad para CaretIndex y vincúlela al control ComboBox personalizado:
    private int _caretIndex;
    public int CaretIndex
    {
        get { return _caretIndex; }
        set
        {
            _caretIndex = value;
            OnPropertyChanged(nameof(CaretIndex));
        }
    }
    
    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            _text = value;
            OnPropertyChanged(nameof(Text));
        }
    }
    
    <local:customcombobox text="{Binding Text}" caretindex="{Binding CaretIndex}"></local:customcombobox>
    
    1. Maneje la lógica de restablecimiento de CaretIndex en su ViewModel:
    private void ResetCaretIndex()
    {
        CaretIndex = Text.Length;
    }
    

    Cuando el usuario hace clic en el botón Desplegable, la propiedad CaretIndex se actualizará con el valor Length de Text en el ViewModel, y el cursor del TextBox se posicionará al final del texto.

Comments are closed.