5

独自のチェックボックス (UserControl) を作成しました。バインディング ソースとして機能する ControlSource というプロパティがあります。ただし、ControlSource のデータ型もカスタム型です。遊んだ後は、

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

ここでインターフェースソリューションを試しました:

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

私の目的は、true、false、または null の代替文字列式を知っている独自の bool データ型を使用できるようにすることです。ただし、グループボックス コントロールは一般的にコーディングする必要があります。そのため、インターフェース ソリューションが頭に浮かびました。しかし、うまくいきません。「よく使われる」解決策があると確信していますね。

4

2 に答える 2

0

最後に、回避策を選択しました。チェックボックスを継承し、コントロールソースプロパティにカスタムデータ型を明示的に使用しました。したがって、インターフェイスや抽象クラスは必要ありません...それは最善の解決策ではありません。

于 2013-01-02T12:01:03.313 に答える
0

データ型を拡張するのではなく、IValueConverter を実装して文字列表現を生成するのはどうですか?

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

于 2013-01-03T05:10:26.150 に答える