1

標準のwpfコンボボックスにいくつかの追加機能を追加しました。コンストラクターで、2つのプロパティを設定しました。

public SmartComboBox()
            : base()
        {
            this.IsEditable = true;
            this.IsTextSearchEnabled = false;
            ...
        }

2つのプロパティは、System.Windows.Controls.ComboBoxから継承されます。コンストラクターで値を設定した後、これら2つのプロパティが変更されないようにするにはどうすればよいですか?

4

4 に答える 4

6

簡単な答え:プロパティ修飾子は自分で変更できないため、できません。実装を非表示にする場合は、クラスをクラス内にカプセル化するだけです。 ComboBox

public class SmartComboBox {

     private ComboBox _uiCombo = ....
}

また、さらに別のこともあります。

あなたの例では、提示されたコードでは、によって呼び出されるため、明示的base()に呼び出す理由はありません。ctorCLR

于 2012-10-23T18:35:12.880 に答える
1

あなたはそれを完全に防ぐことはできません、あなたが来ることができる最も近いのはプロパティを新しいものとして再宣言することです

public SmartComboBox()
{
    base.IsEditable = true;
    base.IsTextSearchEnabled = false;
    ...
}

public new bool IsEditable { get { return base.IsEditable; } }
public new bool IsTextSearchEnabled { get { return base.IsTextSearchEnabled; } }

これの欠点は、newがオーバーライドではないことです。オブジェクトがその親としてキャストされている場合は、プロパティを設定できます。

もう1つのオプションは、Tigranが述べたようにクラスをラップすることですが、それを使用したピタは、必要な他のすべてのプロパティを公開します。

于 2012-10-23T18:41:06.017 に答える
1

IsEditablePropertyのメタデータをオーバーライドし、PropertyChangedCallBackとCorceValueCallBackで遊んだ場合はどうなりますか?http://msdn.microsoft.com/en-us/library/ms597491.aspx

于 2012-10-24T10:47:55.920 に答える
0

が仮想としてマークされている場合IsEditable、それを行うのは簡単なはずです

bool iseditableSet=false;
override bool IsEditable
{
    get;
    set
    {
      if(!iseditableSet){
        iseditableSet=true;
        base.IsEditable=value;
      }else{
        throw Exception...
    }     
}

仮想としてマークされていない場合は難しくなりますが、「非表示」を使用して、非常に明示base.的なディレクティブなしで少なくとも独自のコードがプロパティを変更するのを防ぐことができます。もちろん、これを処理している場合は、物理的に不可能です。取る関数でComboboxあり、これらのプロパティを変更する可能性があります。プロパティがほとんど常に仮想である必要がある理由をレッスンとして受け止めてください

于 2012-10-23T18:35:29.680 に答える