2012-12-29 2 views
5

Ho creato la mia casella di controllo (UserControl). Ha una proprietà denominata ControlSource che funziona come origine di associazione. Tuttavia, il tipo di dati di ControlSource è anche un tipo personalizzato. Dopo aver suonato in giro,C# Custom CheckBox + Tipo di binding personalizzato

... 
    [System.ComponentModel.Bindable(true), Browsable(true), Category("Behavior")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public IMyBool ControlSource 
    { 
     get { return this.chx.Checked ? IMyBool.True : IMyBool.False; } 
     set { this.chx.Checked = value.Value; } 
    } 
    ... 

Ho cercato una soluzione di interfaccia qui:

public interface IMyBool 
{ 
    bool Value { get; set; } 

    IMyBool True { get; } 
    IMyBool False { get; } 
} 

public class MyBool 
{ 
    protected bool? _bValue = null; 

    protected string _sTrue = String.Empty; 
    protected string _sFalse = String.Empty; 
    protected string _sNull = String.Empty; 

    public MyBool(bool? bValue = null) 
    { 
     this._bValue = bValue; 
    } 

    public override string ToString() 
    { 
     return this._bValue.HasValue ? (this._bValue.Value ? _sTrue : _sFalse) : _sNull; 
    } 

    public bool Value 
    { 
     get { return this._bValue.Value; } 
     set { this._bValue = value; } 
    } 
} 

public class MyInvoiceBool : MyBool, IMyBool 
{ 
    public static implicit operator MyInvoiceBool(bool? bValue) 
    { 
     return bValue.HasValue ? (bValue.Value ? True : False) : Null; 
    } 
    public static implicit operator bool?(MyInvoiceBool ivbValue) 
    { 
     return ivbValue._bValue; 
    } 

    public MyInvoiceBool(bool? bValue = null) 
    { 
     base._sTrue = "Rechnung wird gestellt"; 
     base._sFalse = "Rechnung wird nicht gestellt"; 
     base._bValue = bValue; 
    } 

    public static MyInvoiceBool True 
    { 
     get { return new MyInvoiceBool(true); } 
    } 
    public static MyInvoiceBool False 
    { 
     get { return new MyInvoiceBool(false); } 
    } 
    public static MyInvoiceBool Null 
    { 
     get { return new MyInvoiceBool(); } 
    } 
} 

public class MyInvoiceAddressBool : MyBool 
{ 
    public static implicit operator MyInvoiceAddressBool(bool? bValue) 
    { 
     return bValue.HasValue ? (bValue.Value ? True : False) : Null; 
    } 
    public static implicit operator bool?(MyInvoiceAddressBool ivbValue) 
    { 
     return ivbValue._bValue; 
    } 

    public MyInvoiceAddressBool(bool? bValue = null) 
    { 
     base._sTrue = "Abweichende Rechnungsadresse"; 
     base._bValue = bValue; 
    } 

    public static MyInvoiceAddressBool True 
    { 
     get { return new MyInvoiceAddressBool(true); } 
    } 
    public static MyInvoiceAddressBool False 
    { 
     get { return new MyInvoiceAddressBool(false); } 
    } 
    public static MyInvoiceAddressBool Null 
    { 
     get { return new MyInvoiceAddressBool(); } 
    } 
} 

Il mio obiettivo è che posso usare il mio tipo di dati bool che conosce un'espressione stringa di un'alternativa per vero, falso o nullo. Tuttavia, il controllo groupbox dovrebbe essere codificato in generale. Ecco perché mi è venuta in mente una soluzione di interfaccia. Comunque, non funziona. Sono abbastanza sicuro che esista una soluzione "spesso usata", vero?

risposta

0

Infine, ho scelto una soluzione: ho ereditato la casella di controllo e utilizzato esplicitamente il mio tipo di dati personalizzato per la proprietà della sorgente di controllo. Quindi, non ho bisogno di un'interfaccia o di una classe astratta ... Non è la soluzione migliore.