2010-08-07 4 views
6

In einem Winforms-Formular möchte ich dem Benutzer visuelle Hinweise geben, wenn ein Eingabefeld einen ungültigen Wert enthält. Zu diesem Zweck möchte ich die ForeColor-Eigenschaft einer Eingabefeldbezeichnung an die (boolesche) IsPropertyValid-Eigenschaft des zugrunde liegenden Modells binden, so dass die Beschriftung bei IsPropertyValid == false rot wird.Winforms-Datenbindung: Kann ein TypeConverter anstelle der Format/Parse-Ereignisse verwendet werden?

Was ich derzeit haben, ist ein Ereignishandler für das Format Veranstaltung Bindung:

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

Wenn ich dies in WPF tun wollte, ich nehme an, ich eine benutzerdefinierte angeben würde value converter (bool-Color) direkt mit dem Bindung im XAML. Am wichtigsten, ich würde nicht auf ein bestimmtes Steuerelement über seinen Namen verweisen müssen.

Ich möchte das gleiche mit meinem Winforms-Formular machen. Im Idealfall könnte ich ein TypeConverter Objekt für eine bestimmte Bindung direkt im Forms Designer angeben. Ist das möglich?

Antwort

5

My previous answer (now deleted) war falsch: Diese kann getan werden, eine benutzerdefinierte TypeConverter verwenden.

Zuerst braucht man einen geeigneten Konverter. (Im Gegensatz zu XAML, ein nicht implementiert eine IValueConverter, sondern ergeben sich aus TypeConverter.) Zum Beispiel:

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

Als nächstes (und im Gegensatz auch mit XAML Datenbindung) dieser Konverter ist nicht auf die Bindung angewendet selbst; es muss auf die Datenquelle der Eigenschaft angebracht wird die [TypeConverter] attribute mit:

// using System.ComponentModel; 

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

Schließlich, formatting muss verbindlich für die Daten aktiviert werden:

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

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

Beachten Sie, dass dieses Beispiel nur mit Einweg Angeboten (Datenquelle zur Kontrolle) Datenbindung. Für eine wechselseitige Datenbindung müssten Sie zusätzlich die Methoden TypeConverter.ConvertFrom und TypeConverter.CanConvertFrom überschreiben.

-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

Könnten Sie bitte erklären, wie dieser Code funktionieren soll und wie er die Frage beantwortet? – stakx

Verwandte Themen