如果调用base,为什么不在WPF中重新声明DataContext属性

时间:2011-08-04 15:47:29

标签: c# wpf design-patterns

在XAML文件后面的代码中,如果我的DataContext始终是一个众所周知的类,我通常会重新声明DataContext,如下所示:

public new Cow DataContext
{
    get { return base.DataContext as Cow; }
    set { base.DataContext = value; }
}

这样我就可以在我的文件范围内将DataContext作为一个Cow处理,我很安全(至少我是这么认为)使用 base.DataContext来处理它的所有逻辑

有些人有很多经验,已经告诉我这不是一个好的模式。

我想知道可能出现的问题以及为什么不使用它。我已经考虑了很多,想不到一个

谢谢

2 个答案:

答案 0 :(得分:4)

在思考了一段时间之后,我找不到任何严重的问题,除非是我要解释的这个角落案例。

假设您的Xaml属于一个名为MyUserControl的类,并且它继承自UserControl。

我们假设你有:

UserControl ctrl = new MyUserControl();
ctrl.DataContext = new Dog();

这显然是合法的,并且您不受MyUserControl类型安全性的保护,因为引用变量的类型是UserControl,其DataContext属性仍然是对象类型。但是,让我们想象一下,在MyUserControl的上下文中尝试以下内容:

Cow c = this.DataContext;

c将为null。这就是你的意图。但是,它可能会使您在调试场景中的生活变得更加困难,因为您会认为您的DataContext为null,而它根本不是您所期望的那样。当你的datacontext似乎为null时,可能更难理解为什么你的数据绑定都很有趣。

我的方法不是隐藏DataContext属性,而是通过新属性重新公开它:

public Cow Model
{
    get
    {
        return this.DataContext as Cow;
    }
    set
    {
        this.DataContext = value;
    }
}

在我上面设置的场景中,当Model属性返回null时,DataContext将返回对Dog实例的引用,更恰当地反映了实际发生的事情。或者,您可以通过返回以下内容来实现DataContext属性的getter:

return (Cow)this.DataContext;

至少你会收到一个异常,告诉你DataContext确实有什么东西,但不是你想要的东西。然而,它确实看起来很俗气。

无论如何,这确实不是一个严重的问题,只是在我设定的情景下可能带来的不便。

答案 1 :(得分:0)

好吧,我没有发现任何问题,这只会对IntelliSense有帮助......它不会将DataContext依赖属性改为Cow ...所以就绑定或样式等WPF功能而言,没有类型安全性