2016-07-22 49 views
2

,哪一项是设置的DataContext在后面的代码以正确的方式:订购代码设置DataContext的背后

public ViewConstructor() 
{ 
    InitializeComponent(); 
    DataContext = new MyViewModel(); 
} 

public ViewConstructor() 
{ 
    DataContext = new MyViewModel(); 
    InitializeComponent(); 
} 

+2

两者都是 “正确的”。但是,如果视图是一个用户控件,你不应该设置它的DataContext可言,因为这将阻止继承从窗口或父控件一个DataContext。 – Clemens

回答

0

给的答复是:这取决于

如果你的屏幕中含有大量数据或复杂数据驱动的可视化的,你可能要推迟或错开其负荷,这可能使第一个选项更好。如果它是一个简单的数据绑定表单,则第二个选项可能更可取。或者它甚至可以忽略不计。与往常一样,测量是回答您的具体条件下问题的最佳途径。

让我们来看看通过启用跟踪上一个绑定会发生什么。

<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> 

第一种选择 - InitializeComponent第一

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

在这里,我们看到,在InitializeComponent(当XAML加载)的绑定尝试解决,但看到DataContext为空,所以他们的评价是推迟

调试输出:

Initializing 
System.Windows.Data Warning: 56 : Created BindingExpression (hash=55924514) for Binding (hash=26055869) 
System.Windows.Data Warning: 58 : Path: 'IsEnabled' 
System.Windows.Data Warning: 60 : BindingExpression (hash=55924514): Default mode resolved to OneWay 
System.Windows.Data Warning: 61 : BindingExpression (hash=55924514): Default update trigger resolved to PropertyChanged 
System.Windows.Data Warning: 62 : BindingExpression (hash=55924514): Attach to System.Windows.Controls.Grid.IsEnabled (hash=21411931) 
System.Windows.Data Warning: 67 : BindingExpression (hash=55924514): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=55924514): Found data context element: Grid (hash=21411931) (OK) 
System.Windows.Data Warning: 71 : BindingExpression (hash=55924514): DataContext is null 
System.Windows.Data Warning: 65 : BindingExpression (hash=55924514): Resolve source deferred 
Initialized 
Setting DataContext 
DataContext Set 
System.Windows.Data Warning: 67 : BindingExpression (hash=55924514): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=55924514): Found data context element: Grid (hash=21411931) (OK) 
System.Windows.Data Warning: 78 : BindingExpression (hash=55924514): Activate with root item ViewModel (hash=45063479) 
System.Windows.Data Warning: 108 : BindingExpression (hash=55924514): At level 0 - for ViewModel.IsEnabled found accessor ReflectPropertyDescriptor(IsEnabled) 
System.Windows.Data Warning: 104 : BindingExpression (hash=55924514): Replace item at level 0 with ViewModel (hash=45063479), using accessor ReflectPropertyDescriptor(IsEnabled) 
System.Windows.Data Warning: 101 : BindingExpression (hash=55924514): GetValue at level 0 from ViewModel (hash=45063479) using ReflectPropertyDescriptor(IsEnabled): 'False' 
System.Windows.Data Warning: 80 : BindingExpression (hash=55924514): TransferValue - got raw value 'False' 
System.Windows.Data Warning: 89 : BindingExpression (hash=55924514): TransferValue - using final value 'False' 

第二个选项 - 设置DataContext第一

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

这里的绑定初始化时立即评估。

调试输出:

Setting DataContext 
DataContext Set 
Initializing 
System.Windows.Data Warning: 56 : Created BindingExpression (hash=27331439) for Binding (hash=41386841) 
System.Windows.Data Warning: 58 : Path: 'IsEnabled' 
System.Windows.Data Warning: 60 : BindingExpression (hash=27331439): Default mode resolved to OneWay 
System.Windows.Data Warning: 61 : BindingExpression (hash=27331439): Default update trigger resolved to PropertyChanged 
System.Windows.Data Warning: 62 : BindingExpression (hash=27331439): Attach to System.Windows.Controls.Grid.IsEnabled (hash=16919637) 
System.Windows.Data Warning: 67 : BindingExpression (hash=27331439): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=27331439): Found data context element: Grid (hash=16919637) (OK) 
System.Windows.Data Warning: 78 : BindingExpression (hash=27331439): Activate with root item ViewModel (hash=25445597) 
System.Windows.Data Warning: 108 : BindingExpression (hash=27331439): At level 0 - for ViewModel.IsEnabled found accessor ReflectPropertyDescriptor(IsEnabled) 
System.Windows.Data Warning: 104 : BindingExpression (hash=27331439): Replace item at level 0 with ViewModel (hash=25445597), using accessor ReflectPropertyDescriptor(IsEnabled) 
System.Windows.Data Warning: 101 : BindingExpression (hash=27331439): GetValue at level 0 from ViewModel (hash=25445597) using ReflectPropertyDescriptor(IsEnabled): 'False' 
System.Windows.Data Warning: 80 : BindingExpression (hash=27331439): TransferValue - got raw value 'False' 
System.Windows.Data Warning: 89 : BindingExpression (hash=27331439): TransferValue - using final value 'False' 
Initialized 
相关问题