我可以像这样指定DataContext:
<Window ... >
<Window.DataContext>
<MainViewModel />
</Window.DataContext>
...
</Window>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,WPF将创建一个MainViewModel类型的对象,并将其分配给窗口的DataContext属性(这发生在Window的InitializeComponent()方法中).
但是如果我ViewModel没有默认构造函数怎么办呢.或者,如果我想初始化ViewModel并在Window.InitializeComponent()执行后将其分配给DataContext (在Window的构造函数内或从实例化窗口的相同代码中) - 在这种情况下,WPF创建一个ViewModel(内部InitializeComponent()),将其分配给窗口的DataContext,然后我用另一个ViewModel实例覆盖它(我担心这里不必要的对象实例化).
我希望能够只指定一种类型ViewModel,所以如果我在{Binding}中拼错一个属性名称(或重命名属性后),我会得到设计时警告,或者我可以通过点击(在XAML中转到声明) )在{Binding PropertyName}内的属性名称上.
谢谢你无价的时光.
我的数据绑定版本号如下所示:
<Window <!-- ... --> DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TextBlock>
Version is:
<Run Text="{Binding Version, Mode=OneWay}"></Run>
and advancing...
</TextBlock>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
它在运行期间正在运行.
如何在Visual Studio 2012的XAML编辑器中在设计时看到它?我只看到:
Version is: and advancing...
Run Code Online (Sandbox Code Playgroud)
代替:
Version is: 5.2.2 and advancing...
Run Code Online (Sandbox Code Playgroud)
下面的Jure的答案有效,但我最终使用了虚拟视图模型静态代码技术,这对我来说更好,因为数据是真实视图模型类型的模拟:
d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...
Run Code Online (Sandbox Code Playgroud)