【发布时间】:2016-12-07 16:27:14
【问题描述】:
我的 Visual Studio 上有 Resharper,因此在 WPF xaml 文件中设置 DataContext 对于访问 IntelliSense 非常有用。像这样的:
<UserControl ... blah blah namespace stuff >
<UserControl.DataContext>
<viewModels:FooViewModel />
</UserControl.DataContext>
<Label Text={Binding SomeText} /> <!-- I can get IntelliSense for SomeText -->
...
但是,在将 ViewModel/DataContext 提供给视图之前,我想对其进行一些初始化。像这样的:
public class FooViewModel : INotifyPropertyChanged {
private Foo Model { get; set; }
public FooViewModel(Foo model) {
Model = model;
}
// Only here for WPF compatibility - I realise this might be the root of my problems :)
public FooViewModel()
: this (new Foo) {
}
public string SomeText { ... }
...
}
public class ShowFooer {
public void ShowFoo() {
Foo model = ... // get the foo from where ever
FooViewModel viewModel = new FooViewModel(model);
FooWindow window = new FooWindow(viewModel); // Push the data context into the constructor
view.Show();
...
}
}
当我通过此调试时,我发现创建了 2 个 FooViewModels - 一个将上下文推送到构造函数中,另一个在 FooWindow 的 InitialiseComponents 中自动创建。
tl;dr: 有没有办法告诉 WPF 我已经有一个数据上下文并且我只是使用数据上下文 xaml 标记来获取 IntelliSense?有没有办法阻止它创建一个新的上下文?目前,我只是在编译时注释掉数据上下文行,在编码时取消注释它们。
或替代问题: 有没有办法在构造函数之后设置数据上下文,但从第二个数据上下文初始化所有字段,而无需执行一长串 OnPropertyChanged 调用?
【问题讨论】: