Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据何时绑定?如何加快绑定速度?_C#_Wpf_Xaml_Data Binding_Datagrid - Fatal编程技术网

C# 数据何时绑定?如何加快绑定速度?

C# 数据何时绑定?如何加快绑定速度?,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,在代码中,我看到在视图的构造函数中,我将DataContext设置为视图模型的一个新实例。走进它,我可以看到现场的东西已经设置好了。回到视图的构造函数,我可以验证视图模型的属性是否已设置,元素的计数是否正确 然后。。。(我们马上回到这里) 最后,我可以看到呈现的GUI,其中视图模型生成的数据按预期显示。一切都按计划进行了。现在,我只需要将网格的第一行设置为选中,这应该不是问题,因为我知道数据在那里(通过进入模型视图的构造函数进行验证,观察数据上下文的字段和实际窗口的内容) 但是没有。。。(现在,

在代码中,我看到在视图的构造函数中,我将DataContext设置为视图模型的一个新实例。走进它,我可以看到现场的东西已经设置好了。回到视图的构造函数,我可以验证视图模型的属性是否已设置,元素的计数是否正确

然后。。。(我们马上回到这里)

最后,我可以看到呈现的GUI,其中视图模型生成的数据按预期显示。一切都按计划进行了。现在,我只需要将网格的第一行设置为选中,这应该不是问题,因为我知道数据在那里(通过进入模型视图的构造函数进行验证,观察数据上下文的字段和实际窗口的内容)

但是没有。。。(现在,让我们回到前面提到的地方)

当我在构造器中研究网格的DataItems属性时,我发现其中没有元素。因为我在屏幕上看到了这些,我知道它们必须以某种方式到达那里,但是显然,视图模型的属性内容的绑定发生在构造函数运行之后

我希望在构造函数中执行绑定(如果这是最合适的方法)。作为B计划,我正在考虑对一些事件(比如Blopp_OnDataBound(…)或其他什么)做出反应,但除了这些,我什么也没发现。我已将TargetUpdated=“TheGriddy\u OnTargetUpdated”放在数据源绑定的旁边,但该方法不调用

注意。即使我是在一个特定的控件上做这件事,我相信这个问题通常适用于任何控件,因为它是关于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!");
}
问题是,该异常从未在构造函数中抛出,而是 在方法上。数据源设置为绑定,所以绑定必须在构造函数运行之后发生,对吗


我需要选择第一行。这可以在第一行存在时完成…

数据绑定似乎在第一次显示窗口时的
LayoutUpdated
事件期间发生。我认为B计划是目前为止唯一可行的办法。使用线程中提到的
TargetUpdated
事件,但是请注意,您需要显式地启用
NotifyOnTargetUpdated
,否则它将不会触发(正如您已经看到的)

我读了两遍你的问题,但我仍然无法理解情况的复杂性。我知道这是一个很大的工作,但是安在这里真的很有帮助。另外,我认为一个带有一些注释的代码片段将有助于理解您的问题-我们编写代码而不是文献:-)@Heinzi我添加了一些示例。“也许这有助于澄清我的问题。”德拉普按要求回答。享受。:)你认为TargetUpdated与Loaded有什么关系(当然,如果我在那里做同样的事情的话)?它会不会不那么受欢迎?我将只在用户加载视图时执行该操作,而不是在他们稍后处理该操作时执行。@KonradViltersten当然,您可以使用Loaded,但TargetUpdated IMO更好,因为它会在每次重新绑定时触发(当然,如果您这样做的话)。但是如果你只需要这些,一定要先使用Loaded-TargetUpdated fires,然后再使用Loaded。