将DataContext限制为窗口的ViewModel是否有问题



我觉得让任何对象成为我视图的DataContext都不舒服。由于我遵循MVVM模式,所有窗口都有自己的VM。我计划做的是以下(取自一个名为Options的窗口):

    internal new OptionsVM DataContext
    {
        get
        {
            return (OptionsVM) base.DataContext;
        }
        set
        {
            if (this.DataContext != value)
            {
                base.DataContext = value;
            }
        }
    }

你看到我是不是错过了什么,或者这可能是一个坏主意,因为我不知道什么?

提前谢谢。

通常,隐藏接口元素会导致奇怪的错误。例如,以下代码将生成InvalidCastException:

OptionsView view = new OptionsView();
Window window = view;
window.DataContext = new DifferentVM();
OptionsVM = view.DataContext;

这是一个有点做作的例子,但如果您曾经使用WPF绑定来设置对象的DataContext,那么类似的场景很可能发生。

我发现最好让DataContext属性按照设计的方式存在,并为我的视图提供一个构造函数,该构造函数以更强类型的方式接受数据上下文。在View的代码中,我还有一个适当类型的ViewModel属性:

public OptionsView(OptionsVM viewModel)
{
    DataContext = viewModel;
}
private OptionsVM ViewModel { get { return DataContext as OptionsVM; } }

我能看到的唯一问题是,如果使用构造

Window view = new OptionsView();
view.DataContext = ....;

那么DataContext仍然是object类型-它要求您始终使用视图类型的引用来查看您的强类型

你的方法应该不会带来危险-如果它让你更容易,就强制执行它。只需确保你评论为什么选择以这种方式实现它。我完全支持在基本Object类上进行更强的数据键入。我认为这实际上让它更清楚地了解了支持的上下文是什么

即使使用@SeanU建议的构造函数方法,也不会阻止其他人在创建后更改DataContext类型。

最新更新