2009-03-03 25 views
7

Tengo un control personalizado (Windows Form) que es un cuadro de texto de búsqueda. Una propiedad en el Control es la Selección actual que es un Objeto personalizado que contiene "Identificador", "Código" y "Descripción". Esta propiedad está unida a datos utilizando un BindingSource.Databinding a Custom Control

Mostrar la información funciona muy bien. Por otro lado, independientemente de si configuro la Actualización como OnValidate o OnValueChange, nunca actualiza BindingSource. ¿Hay algo que me falta para que esto se actualice automáticamente?

private System.Windows.Forms.BindingSource buildPlanComponentDataBindingSource; 

    public void LoadBuildPlan(string itemNumber) 
    { 
     var buildPlanComponents = BuildPlan.LoadBuildPlanComponents(itemNumber, AutomaticPrice); 
     buildPlanComponentDataBindingSource.DataSource = buildPlanComponents; 
     AssemblyNumber = itemNumber; 
    } 




[Bindable(true)] 
[DefaultValue(null)] 
public ILookupSelection CurrentSelection 
{ 
    get 
    { 
     if (currentSelection == null) 
      currentSelection = new LookupSelection {Code = txtLookup.Text}; 

     return currentSelection; 
    } 

    set 
    { 
     if (value == null) return; 

     currentSelection = value; 

     SetText(currentSelection, DisplayText); 
     SetDescription(currentSelection, DisplayDescription); 
    } 
} 
+0

¿Podría mostrarnos el código donde crea el enlace de datos? – overslacked

+0

Gracias, su pregunta fue muy útil. Por algún motivo, el tutorial de MSDN omitió el atributo [Bindable (true)] de su tutorial. ¡Ese es un detalle importante! –

Respuesta

2

¡Implementar INotifyPropertyChanged parece ser la solución!

#region IPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (null != PropertyChanged) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

    #endregion 
+0

IPropertyChanged debe leer INotifyPropertyChanged. Copié el código y me dejé engañar por este detalle al definir la herencia. De lo contrario, esto es genial, +1 – Marcel

0

Visualización de la información de obras grande. Por otro lado, independientemente de si establezco la actualización en OnValidate o OnValueChange, nunca actualiza el BindingSource.

En cuanto a su código, en realidad no estoy seguro de esto. En su conjunto, prueba nulo y abandona; si los datos realmente contienen nulo (que es lo que está describiendo), su control no estará sincronizado. Me pregunto si tal vez ese control está enmascarando el problema subyacente.

+0

El único momento que realmente es NULL es cuando se crea el control inicialmente. De lo contrario, esto solo se establecerá cuando se realice una selección que contenga un valor. – ejmack

+0

Si ese es el caso, le recomendaría que use una bandera diferente para probar, que no sea value == null. La vinculación de datos a las propiedades es un proceso de ida y vuelta ... en cualquier caso, limpiaría esta parte, pero tampoco estoy seguro de que al final ayude con tu problema. – overslacked

0

¿Quizás necesite hacer que DataBinding escriba su valor para cada control cuyo valor está configurando de esta manera?

Suponiendo una unión para un cuadro de texto llamado txtMySetValue datos:

txtMySetValue.DataBindings [0] .WriteValue();