我的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个FooViewModel
- 一个用于将上下文推送到构造函数中,另一个在InitialiseComponents
FooWindow
中自动创建}。
tl; dr:有没有办法告诉WPF我已经拥有数据上下文,而我只是使用数据上下文xaml标记来获取IntelliSense?有没有办法阻止它创建一个新的上下文?目前,我只是在编译时注释掉数据上下文行,并在编码时取消注释它们。
或替代问题:有没有办法在构造函数之后设置数据上下文,但是必须从第二个数据上下文初始化所有字段,而不必执行{{1}的长列表打电话?
答案 0 :(得分:6)
是。你可以用这个:
<UserControl
xmlns:viewModels="clr-namespace:..."
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance viewModels:FooViewModel,
IsDesignTimeCreatable=True}" ...> ...
通过这种方式,您可以获得所有vm属性的自动完成功能。
答案 1 :(得分:0)
以下XAML标记将使用默认的无参数构造函数在运行时创建视图模型的实例:
<UserControl.DataContext>
<viewModels:FooViewModel />
</UserControl.DataContext>
因此,如果您使用另一个带有模型参数的重载以编程方式自己构造视图模型,则应删除此标记(可能还有默认构造函数)。
然后,您可以按照Schwammkopf的建议设置设计时数据上下文,以便在Visual Studio中获取智能感知。