2009-02-24 12 views
6

que quieren crear cuadro combinado editable con las siguientes propiedades:ComboBox editable

  1. enlaza la propiedad de texto a mi modelo de datos.
  2. El modelo de datos puede anular los cambios en la GUI, incluso en la Selección modificada. P.ej. Puedo elegir entre 1, 2, 3 elijo 2, pero algún componente abajo debajo cambios a 3.
  3. actualización del modelo de datos en los siguientes eventos:

    1. Selección Changed
    2. enfoque Pierde
    3. Ingrese presionado (debe comportarse igual que el enfoque perdido).

he sido capaz de crear tal control, pero es bastante feo (usando hacks) y esperaba que no hay una manera más sencilla ...

Gracias de antemano

Respuesta

2

Ok, esto es lo que he hecho, y que no es tan fea:

/// <summary> 
/// Editable combo box which updates the data model on the following: 
/// 1. Select## Heading ##ion changed 
/// 2. Lost focus 
/// 3. Enter or Return pressed 
/// 
/// In order for this to work, the EditableComboBox requires the follows, when binding: 
/// The data model value should be bounded to the Text property of the ComboBox 
/// The binding expression UpdateSourceTrigger property should be set to LostFocus 
/// e.g. in XAML: 
/// <PmsEditableComboBox Text="{Binding Path=MyValue, UpdateSourceTrigger=LostFocus}" 
/// ItemsSource="{Binding Path=MyMenu}"/> 
/// </summary> 
public class PmsEditableComboBox : ComboBox 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="PmsEditableComboBox"/> class. 
    /// </summary> 
    public PmsEditableComboBox() 
     : base() 
    { 
     // When TextSearch enabled we'll get some unwanted behaviour when typing 
     // (i.e. the content is taken from the DropDown instead from the text) 
     IsTextSearchEnabled = false; 
     IsEditable = true; 
    } 

    /// <summary> 
    /// Use KeyUp and not KeyDown because when the DropDown is opened and Enter is pressed 
    /// We'll get only KeyUp event 
    /// </summary> 
    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     base.OnKeyUp(e); 

     // Update binding source on Enter 
     if (e.Key == Key.Return || e.Key == Key.Enter) 
     { 
      UpdateDataSource(); 
     } 
    } 

    /// <summary> 
    /// The Text property binding will be updated when selection changes 
    /// </summary> 
    protected override void OnSelectionChanged(SelectionChangedEventArgs e) 
    { 
     base.OnSelectionChanged(e); 
     UpdateDataSource(); 
    } 

    /// <summary> 
    /// Updates the data source. 
    /// </summary> 
    private void UpdateDataSource() 
    { 
     BindingExpression expression = GetBindingExpression(ComboBox.TextProperty); 
     if (expression != null) 
     { 
      expression.UpdateSource(); 
     } 
    } 

} 
0

la forma más sencilla de hacerlo es utilizar la propiedad UpdateSourceTrigger en la unión. Es posible que no pueda hacer coincidir exactamente su comportamiento actual, pero puede encontrar que es comparable.

La propiedad UpdateSourceTrigger controla cuándo el destino del enlace actualiza el origen. Diferentes controles WPF tienen diferentes valores predeterminados para esta propiedad cuando están vinculados.

Estas son las opciones:

UpdateSourceTrigger.Default = permitir el control de destino para determinar el modo de UpdateSourceTrigger.

UpdateSourceTrigger.Explicit = Solo fuente de actualización cuando alguien llama a BindingExpression.UpdateSource();

UpdateSourceTrigger.LostFocus = Actualiza automáticamente la fuente de enlace siempre que el objetivo pierda el foco. De esta forma, se puede completar un cambio, y luego el enlace se actualiza después de que el usuario continúe.

UpdateSourceTrigger.PropertyChanged = Siempre que DependencyProperty en el destino cambie los valores, la fuente se actualiza inmediatamente. La mayoría de UserControls no tienen esta propiedad de forma predeterminada porque requiere más actualizaciones de enlace (puede ser un problema de rendimiento).