在WPF窗口的构造函数中,在InitializeComponent()之后应该怎么做?

see*_*ker 7 wpf coding-style

一般来说,我之前一直在初始化Window自身的属性,然后InitializeComponent()设置其中包含的控件.但是,我并没有那么一致,我没有真正注意到订购的问题.所以:

  • 我(可能)做了一件可怕的事吗?特别是,之前设置子控件的属性是否有任何问题InitializeComponent()
  • 在这方面有什么好的风格?

编辑:由于我得到的前两个答案有点矛盾,让我更具体一点:

public Foo Foo {get; protected set}
public FooWindow (Foo foo)
{
    Foo = foo;
    this.Closing += FooWindow_Closing;
    Foo.Frobbed += Foo_Frobbed;

    InitializeComponent();

    this.DataContext = this;
    this.Title = Foo.Name() + " Window";

    FooListView.ItemSource = Foo.CalculateList();

    FocusManager.SetFocusedElement(this, FooListView);
}
Run Code Online (Sandbox Code Playgroud)

这是对的吗?我应该只是做MVVM而在Window构造函数中没有任何东西吗?

Bra*_*non 5

通过在一些其他代码之后调用InitializeComponents,您将冒着用XAML中设置的内容意外覆盖属性或使用未初始化对象的风险。通常,后面的代码比XAML具有更高的优先级,因此我将InitializeComponents(又名,解析并加载XAML)放在顶部。

  • 重要的是要注意,如果使用MVVM,则应在调用InitializeComponent()之前**设置DataContext,否则将无法正确设置ViewModel绑定。InitializeComponent()会调用所有属性绑定获取器,因此,如果首先调用它,则在每个属性上再次调用NotifyPropertyChanged之前,绑定将无法获取正确的值。同样的原理适用于任何其他可能影响xaml初始化方式的初始化逻辑。 (6认同)