我正在逐步完成代码,我发现在我的视图的构造函数中,我将 DataContext 设置为我的视图模型的新实例。走进它,我可以看到字段 Thingies 已设置。退回到视图的构造函数,我可以验证,确实已经设置了视图模型的属性,并且元素的计数是正确的。
然后......(让我们在一秒钟内回到这个位置)
最后,我可以看到渲染的GUI,其中视图模型生成的数据正如所示。一切都按照应有的方式解决了。现在,我只需要将网格的第一行设置为选中,这应该不是问题,因为我知道数据存在(通过模型视图的构造函数的步入验证,监视数据上下文的字段和实际窗口的内容)。
但是没有...(现在,让我们回到前面提到的地方)
当我研究网格的 DataItems 属性时,仍然在构造函数中,我发现其中有零元素。因为我在屏幕上看过那些,我知道他们必须以某种方式到达那里但是,显然,视图模型的属性 Thingies 的绑定发生在之后 / strong>构造函数的运行。
我想在仍然在构造函数中强制执行绑定(如果这是最合适的方法)。作为计划B,我正在考虑对某些事件做出反应(比如 Blopp_OnDataBound(...)或其他什么),但除了target being updated之外我还没有找到任何东西。我在数据源的绑定旁边放了 TargetUpdated =“TheGriddy_OnTargetUpdated”,但该方法没有调用。
NB。即使我在特定控件上执行此操作,我也确信该问题通常适用于任何控件,因为它与XAML / WPF的数据绑定范例有关。如我错了请纠正我。 (我在Infragistics的 XamDataGrid 上,但这种行为很可能适用于好的,旧的,简单的 DataGrid 。)
根据要求,我也提供了一个小样本,我之前没有选择,因为我认为它没有任何帮助。我有所纠正。
public MyView()
{
InitializeComponent();
DataContext = new MyViewModel();
if (xamDataGrid.DataSource != null)
throw new HappyException("yes!");
}
private void SomeMethod()
{
if (xamDataGrid.DataSource != null)
throw new HappyException("yes!");
}
问题是构造函数中从不抛出异常,但是 在方法中。数据源在我们绑定时设置,因此绑定必须在构造函数运行后发生,对吗?
我需要选择第一行。这可以在第一行存在时完成......
答案 0 :(得分:0)
首次显示窗口时,LayoutUpdated
事件期间似乎发生了数据绑定。我认为B计划是目前唯一可行的方式。使用How to detect data binding completed in WPF主题中提到的TargetUpdated
事件,但请注意您需要明确启用NotifyOnTargetUpdated
否则它不会触发(正如您已经看到的那样) )。