在代码后面设置DataContext的顺序

A.B*_*.B. 8 .net c# data-binding wpf

哪一种是在后面的代码中设置 DataContext 的正确方法:

public ViewConstructor()
{
    InitializeComponent();
    DataContext = new MyViewModel();
}
Run Code Online (Sandbox Code Playgroud)

或者

public ViewConstructor()
{
    DataContext = new MyViewModel();
    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*bel 4

答案是:这要看情况

如果您的屏幕包含大量数据或复杂的数据驱动可视化,您可能需要推迟或错开其加载,这可能会使第一个选项更好。如果它是简单的数据绑定表单,则第二个选项可能更好。或者甚至可以忽略不计。与往常一样,测量是在您的特定条件下回答问题的最佳方式。

让我们看看在绑定上启用跟踪会发生什么。

<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid IsEnabled="{Binding IsEnabled, PresentationTraceSources.TraceLevel=High}" />
</Window>
Run Code Online (Sandbox Code Playgroud)

第一个选项 -InitializeComponent第一个

public MainWindow()
{
    Debug.WriteLine("Initializing");
    InitializeComponent();
    Debug.WriteLine("Initialized");
    Debug.WriteLine("Setting DataContext");
    DataContext = new ViewModel();
    Debug.WriteLine("DataContext Set");
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们看到在InitializeComponent(加载 XAML 时)绑定尝试解析,但发现 为DataContextnull,因此它们的评估被延迟

调试输出:

<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid IsEnabled="{Binding IsEnabled, PresentationTraceSources.TraceLevel=High}" />
</Window>
Run Code Online (Sandbox Code Playgroud)

第二个选项 -DataContext首先设置

public MainWindow()
{
    Debug.WriteLine("Setting DataContext");
    DataContext = new ViewModel();
    Debug.WriteLine("DataContext Set");
    Debug.WriteLine("Initializing");
    InitializeComponent();
    Debug.WriteLine("Initialized");
}
Run Code Online (Sandbox Code Playgroud)

这里,绑定在初始化期间立即评估。

调试输出:

public MainWindow()
{
    Debug.WriteLine("Initializing");
    InitializeComponent();
    Debug.WriteLine("Initialized");
    Debug.WriteLine("Setting DataContext");
    DataContext = new ViewModel();
    Debug.WriteLine("DataContext Set");
}
Run Code Online (Sandbox Code Playgroud)