2010-08-07 12 views
6

In un modulo Winforms, voglio fornire indicazioni visive all'utente quando un campo di input contiene un valore non valido. A tal fine, desidero associare la proprietà ForeColor dell'etichetta di un campo di input alla proprietà (booleana) IsPropertyValid del modello sottostante in modo che l'etichetta diventi rossa quando IsPropertyValid == false.Associazione dati Winform: è possibile utilizzare un TypeConverter invece degli eventi Format/Parse?

Quello che ho attualmente è un gestore di eventi per il Format l'evento di rilegatura:

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; 
} 

Se avessi voluto fare questo in WPF, suppongo avrei specificare un personalizzato value converter (bool-Color) direttamente con la vincolante in XAML. Ancora più importante, non dovrei fare riferimento a un controllo specifico tramite il suo nome.

Mi piacerebbe fare la stessa cosa con il mio modulo Winforms. Idealmente, potrei specificare un oggetto TypeConverter per una particolare associazione direttamente nella finestra di progettazione form. È possibile?

risposta

5

My previous answer (now deleted) era corretta: Questo può essere fatto, utilizzando una consuetudine TypeConverter.

Innanzitutto, è necessario un convertitore adatto. (Differenza con XAML, uno non implementare una IValueConverter, ma derivano da TypeConverter.) Ad esempio:

// 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; 
    } 
} 

Avanti, (e anche a differenza di associazione dati XAML,) questo convertitore non viene applicata alla legatura stesso; essa deve essere allegata alla proprietà della sorgente dati utilizzando la [TypeConverter] attribute:

// using System.ComponentModel; 

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

Infine, formatting deve essere abilitato sui associazione dati:

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

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

Si noti che questo esempio si occupa solo a senso unico (fonte dati da controllare) associazione dati. Per l'associazione dei dati a due vie, è inoltre necessario sostituire i metodi TypeConverter.ConvertFrom e 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

Potresti spiegare come funziona questo codice e come risponde alla domanda? – stakx

Problemi correlati