1

我在标准 wpf 组合框中添加了一些额外的东西。在构造函数中,我设置了两个属性:

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

这两个属性继承自 System.Windows.Controls.ComboBox。在构造函数中设置它们的值后,如何防止修改这两个属性?

4

4 回答 4

6

简短的回答:你不能,因为你不能改变属性修饰符。如果要隐藏实现,只需将类封装 ComboBox在类中即可。

public class SmartComboBox {

     private ComboBox _uiCombo = ....
}

此外还有另一件事:

在您的示例中,在提供的代码中,没有任何理由显式调用base()on ctor,因为它将由CLR

于 2012-10-23T18:35:12.880 回答
1

如果您覆盖 IsEditableProperty 的元数据并使用 PropertyChangedCallBack 和 CorceValueCallBack 会怎样?http://msdn.microsoft.com/en-us/library/ms597491.aspx

于 2012-10-24T10:47:55.920 回答
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 不是覆盖,如果对象被转换为其父对象,则可以设置属性。

另一种选择是像 Tigran 提到的那样包装类,但是带有它的皮塔饼会暴露您需要的所有其他属性。

于 2012-10-23T18:41:06.017 回答
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 回答