8

一般来说,我之前一直在初始化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);
}

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

4

3 回答 3

6

通过在某些其他代码之后调用 InitializeComponents,您可能会冒着意外用 XAML 中设置的内容覆盖属性或使用未初始化对象的风险。通常,代码隐藏的优先级高于 XAML,因此我会将 InitializeComponents(也称为解析和加载 XAML)留在顶部。

于 2012-07-13T23:12:35.077 回答
4

在回答您的具体问题时:

我(可能)在做一些可怕的事情吗?特别是在 InitializeComponent() 之前设置子控件的属性有什么问题吗?

在您调用 InitializeComponents 之前,您的子控件可能在代码中不可用。这样做通常是不好的形式。

在这方面有什么好的风格?

这将是一个品味问题,但通常我会建议,如果您要利用 XAML 为您提供的分离,那么我会尽可能地采用它。如果您正在做与 UI 相关的逻辑操作,请尝试在 XAML 中进行。这与其说是 MVVM 的事情,不如说是表示与逻辑的分离。示例代码中的大部分内容都可以通过声明方式完成,即使只是通过 ValueConverters。

例如,如果 Foo 是一个 DependencyProperty,那么您也可以将它附加到 XAML 中并将回调添加为 ValueChanged 回调的一部分。同样,这不是 MVVM,但它是 WPF 的基础。

对于大多数其他事情,您实际上可能希望等到 OnLoaded 被调用,而不是在构造函数中进行工作。

希望有帮助,

于 2012-07-17T22:55:35.657 回答
2

在调用InitializeComponent()之前,我通常会调用任何不需要 Visual Tree 的东西。

我的所有实现都使用 MVVM 模式,所以我更喜欢在 UI 加载到客户端之前实例化并填充我的 ViewModel。

如果你总是先加载InitializeComponent(),你会冒着创建一个糟糕的用户体验的风险,因为它会显示一个突然更新的未填充视图,而不是一个在它进入视图时填充的视图。

于 2012-07-14T15:12:17.230 回答