【问题标题】:DataContext of view is always null视图的 DataContext 始终为空
【发布时间】:2015-11-20 04:56:29
【问题描述】:

我正在尝试使用 DataContext 属性在代码隐藏中访问视图的视图模型。但是,无论我在视图生命周期的哪个时间点尝试访问它,该属性始终是 null

简单的虚拟设置:

// shell
internal class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
    public ShellViewModel() {
        ActivateItem(new MyTestViewModel());
    }
}

// view code-behind
public partial class MyTestView : UserControl {

    public MyTestView() {
        InitializeComponent();
    }

    protected override void OnInitialized(EventArgs args) {
        var vm = DataContext as MyTestViewModel;
        Debug.Assert(vm != null); // is always null!
    }

}

视图 get 已正确初始化,正在调用视图模型,并且两者可以绑定在一起。当我将视图模型的属性绑定到视图控件时,可以毫无问题地访问它。仅在初始化期间,视图的DataContext 始终为null。做什么?

MVVM 框架:Caliburn.Micro

【问题讨论】:

  • 初始化后可以试试,可能是在用户控件的Loaded事件中?
  • 首先检查DataContext 是否为空,因为您可能将DataContext 转换为错误的类型。
  • 在哪里以及如何为视图设置数据上下文?
  • OnInitialized 为时过早。稍后再做。不知道 caliburn 有什么推荐的,因为我不使用它。不知道您为什么要尝试从代码隐藏中操作虚拟机...这是一种代码气味,表明您尝试做的事情可能是错误的。最后一个提示——您可以使用 Dispatcher 安排稍后执行,例如在应用程序空闲后或数据绑定发生后。
  • @Will 你是对的,OnInitialized 在修复它的生命周期中太早了。您可以将此作为答案发布,以便我接受吗?哦,顺便说一句,我不操纵视图模型,我只需要视图模型已经为“视图”提供的一些数据,并且因为代码隐藏只是“视图”的“代码部分” ',除了数据绑定发生的事情之外,我没有做任何其他事情......只是在代码中,因为我正在做标记无法实现的特定于视图的检测。所以不,我不认为这是代码味道。 :)

标签: c# wpf mvvm data-binding caliburn.micro


【解决方案1】:
public partial class MyTestView : UserControl {

  public MyTestView() {
    InitializeComponent();
  }
   
  public MyTestViewModel ViewModel() {
    return (MyTestViewModel)Datacontext;
  }
}

出于某种原因这样做会破坏模式背后的想法,因为不应将视图模型硬编码到视图中。出于测试目的可以理解,但用于任何实际用途;格式不好。

--编辑--我在考虑仅视图操作,但由于某种原因,它已经晚了,并且没有考虑从视图中访问数据而不是从 ViewModel 中访问视图。

这应该可以满足您的需求。只有在框架将视图与视图模型绑定后(即设置了数据上下文,一旦加载已被命中),此功能才会起作用。如果您需要事先做某事,我不确定还有什么更好的解决方案。

【讨论】:

  • 我真的不认为从视图代码隐藏访问视图模型会破坏 MVVM 的想法,因为 a) 代码隐藏在某种程度上是视图的一部分,b) 代码隐藏通常仅针对视图已经通过绑定完成的视图模型的接口,并且 c)它仅在代码隐藏中,因为我需要检测仅使用标记无法实现的视图特定的东西,为此,我需要视图模型数据,即数据绑定也会发生什么。还是我这里有什么问题?
  • 我使用的几乎所有数据都是视图模型中的一个属性,我还遇到过一个实例,我不得不从这种性质的数据上下文中获取数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2011-12-05
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多