可能的重复:
C#关键字用法虚拟 覆盖与新
我试图以以下方式隐藏我的UserControl
内容属性:
public partial class Tile : UserControl
{
public new object Content
{
get { ... }
set { ... }
}
}
但是,当我设置UserControl的内容时,它不会做任何事情(如果我设置了一个断点,则永远不会达到):
<my:Tile Content="The content"/>
或
<my:Tile>The content</my:Tile>
为什么?如何解决此问题?
问题是您没有隐藏实际的依赖关系,只有WPF可能会或可能不总是可能使用的get/set访问器来设置DP的值。WPF具有直接调用dependencyObject.getValue/setValue的优化。
改用名称为" content"的对象上创建一个依赖项属性,然后将get/set访问器进行新颖,以及您正在做的工作应该有效。
public static readonly new DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(Tile));
public new object Content
{
get { return this.GetValue(ContentProperty); }
set { this.SetValue(ContentProperty, value); }
}
我不确定您为什么要这样做,而不仅仅是使用已经存在的内容属性。在我看来,您在这里与框架进行战斗,并且有一种更简单的方法来完成您想要的事情。
如果您想将自己的功能插入Content
属性,则您可能正在寻找的是DependencyProperty.OverrideMetadata()
。这样,您可以在派生的类中添加自己的属性更改的处理程序。看起来像这样:
static Tile()
{
ContentProperty.OverrideMetadata(typeof(Tile), new PropertyMetadata(null, OnContentChanged));
}
private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Your logic goes here.
}
编辑
刚刚看了看,WPF已经为您照顾了这一点。您可以简单地覆盖OnContentChanged
:
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
// Your logic goes here.
}