新的不会隐藏继承的属性



可能的重复:
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.
}

最新更新