在代码隐藏中设置DataContext的顺序
本文关键字:DataContext 顺序 设置 代码 隐藏 | 更新日期: 2023-09-27 17:58:22
在代码隐藏中设置DataContext的正确方法是:
public ViewConstructor()
{
InitializeComponent();
DataContext = new MyViewModel();
}
或
public ViewConstructor()
{
DataContext = new MyViewModel();
InitializeComponent();
}
答案是:取决于。
如果您的屏幕包含大量数据或复杂的数据驱动可视化,您可能需要推迟或交错加载,这可能会使第一个选项更好。如果它是一个简单的数据绑定表单,那么第二个选项可能更可取。或者它甚至可以忽略不计。与往常一样,测量是在您的特定条件下回答问题的最佳方式。
让我们看看在绑定上启用跟踪会发生什么。
<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
为null,因此它们的求值被推迟。
调试输出:
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