2010-08-07 8 views
6

En un formulario de Winforms, quiero proporcionar pistas visuales al usuario cuando un campo de entrada contiene un valor no válido. Para ese fin, quiero vincular la propiedad ForeColor de la etiqueta de un campo de entrada con la propiedad (booleana) IsPropertyValid del modelo subyacente de modo que la etiqueta se ponga roja cuando IsPropertyValid == false.Encuadernación de datos de Winforms: ¿Se puede usar TypeConverter en lugar de los eventos Format/Parse?

Lo que tengo actualmente es un controlador de eventos para el Format evento de unión:

Controls["dateOfBirthLabel"].DataBindings["ForeColor"].Format += convertBoolToColor; 
// (dateOfBirthLabel.ForeColor is bound to a boolean IsDateOfBirthValid property.) 

void convertBoolToColor(object sender, ConvertEventArgs e) 
{ 
    e.Value = (bool)e.Value ? Color.Black : Color.Red; 
} 

Si lo que quería hacer esto en WPF, supongo que tendría que especificar una costumbre value converter (bool a Color) directamente con la vinculante en el XAML. Lo más importante, no tendría que referirme a un control específico a través de su nombre.

Me gustaría hacer lo mismo con mi formulario de Winforms. Idealmente, podría especificar un objeto TypeConverter para un enlace particular directamente en el Diseñador de formularios. es posible?

Respuesta

5

My previous answer (now deleted) era incorrecto: Este puede hacer, utilizando una costumbre TypeConverter.

Primero, uno necesita un convertidor adecuado. (A diferencia de con XAML, uno no implementar un IValueConverter, pero se derivan de TypeConverter). Por ejemplo:

// using System; 
// using System.ComponentModel; 
// using System.Drawing; 
// using System.Globalization; 

sealed class BooleanToColorConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext context, 
             Type destinationType) 
    { 
     return destinationType == typeof(Color); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, 
            CultureInfo culture, 
            object value, 
            Type destinationType) 
    { 
     return (bool)value ? Color.Green : Color.Red; 
    } 
} 

continuación, (y también a diferencia de con el enlace de datos XAML,) este convertidor no se aplica a la unión en sí; que se debe adjuntar a la propiedad de la fuente de datos utilizando la [TypeConverter] attribute:

// using System.ComponentModel; 

partial class DataSource : INotifyPropertyChanged 
{ 
    [TypeConverter(typeof(BooleanToColorConverter))] // <-- add this! 
    public bool IsValid { get { … } set { … } } 
} 

Finalmente, formatting debe estar habilitado en el enlace de datos:

// Control control = …; 
// DataSource dataSource = …; 

control.DataBindings.Add("ForeColor", dataSource, "IsValid", formattingEnabled: true); 
//               ^^^^^^^^^^^^^^^^^^^^^^^ 

Tenga en cuenta que este ejemplo sólo se ocupa de una sola vía (fuente de datos para controlar) enlace de datos. Para el enlace de datos bidireccional, también deberá sobrescribir los métodos TypeConverter.ConvertFrom y TypeConverter.CanConvertFrom.

-3
c.DataBindings.Add("Checked", dataSource, dataMember, true, DataSourceUpdateMode.OnPropertyChanged); 


class Someclass 
{ 
[TypeConverter(typeof(IntBoolConverter))] 
     public int p_isEnable 
     { 
      get { return nc_isEnable; } 
      set { m_isEnable= value); } 
     } 
} 
public class IntBoolConverter:TypeConverter 
    { 
     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 

      if (sourceType == typeof(bool)) 
      { 
       return true; 
      } 
      return base.CanConvertFrom(context, sourceType); 
     } 

     public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
     { 
      if (destinationType == typeof(int)) 
      { 
       return true; 
      } 
      return base.CanConvertFrom(context, destinationType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
     { 
      if (value is bool) 
      { 
       var objectToInt = value.ObjectToBool(); 
       return objectToInt; 
      } 
      return base.ConvertFrom(context, culture, value); 
     } 
     public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
     { 
      if (destinationType == typeof(bool)) 
      { 
       return value.ObjectToBool(); 
      } 
      return base.ConvertTo(context, culture, value, destinationType); 
     } 
    } 
+0

¿Podría explicar cómo se supone que debe funcionar este código y cómo responde la pregunta? – stakx

Cuestiones relacionadas