我在标准的wpf组合框中添加了一些额外的东西。在构造函数中,我设置了两个属性:
public SmartComboBox()
: base()
{
this.IsEditable = true;
this.IsTextSearchEnabled = false;
...
}
这两个属性继承自System.Windows.Controls.ComboBox。 在构造函数中设置它们之后,如何防止修改这两个属性?
答案 0 :(得分:6)
简短回答:您不能,因为您无法更改属性修饰符。
如果要隐藏实现,只需在类中封装 ComboBox
类。
public class SmartComboBox {
private ComboBox _uiCombo = ....
}
还有另外一件事:
在您的示例中,在显示的代码中,没有任何理由在base()
上明确调用ctor
,因为它将由CLR
答案 1 :(得分: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所提到的,但是这个pita暴露了你需要的所有其他属性。
答案 2 :(得分:1)
如果您覆盖IsEditableProperty的元数据并使用PropertyChangedCallBack和CorceValueCallBack,该怎么办? http://msdn.microsoft.com/en-us/library/ms597491.aspx
答案 3 :(得分:0)
如果将IsEditable
标记为虚拟,则执行
bool iseditableSet=false;
override bool IsEditable
{
get;
set
{
if(!iseditableSet){
iseditableSet=true;
base.IsEditable=value;
}else{
throw Exception...
}
}
如果它没有被标记为虚拟,那就更难了,但是你可以使用“隐藏”来防止至少你自己的代码在没有明确的base.
指令的情况下修改属性。当然,这在物理上是不可能的但是,如果你正在处理一个带Combobox
的函数,它可能会修改这些属性。只需把它作为一个教训,为什么属性应该几乎总是虚拟的