我的WPF应用程序使用资源字典。我也在使用MVVM。
我绑定到ResourceDictionary,但是想将我的MainWindow ViewModel绑定到MainWindow(类型为Window),但是MVVM不会让我像MainWindow那样输入UserControl。
<Grid.Resources>
<ResourceDictionary Source="Resources\ResourceDictionary.xaml" />
</Grid.Resources>
<Grid.DataContext>
<Binding Source="{StaticResource Mwvm}" />
</Grid.DataContext>
</Grid>
这意味着我不能这样做
<DataTemplate DataType="{x:Type viewModel:MainWindowViewModel}">
<root:MainWindow x:Key="Mwvm" />
</DataTemplate>
有没有人知道我怎么做同样的事情,但是当对象是一个Window并且只使用XAML时(我知道我可以用app.xaml onstartup()中的代码执行此操作)?
修改 为了清楚地说明这一点,我知道在我的MainWindow中我可以为我的ViewModel声明一个命名空间,但是当我的ResourceDictionary中已经引用了命名空间并且我引用了我的ResourceDictionary时,这是正确的方法。
答案 0 :(得分:1)
<Window>
<Window.DataContext>
<someNs:YourVmClass /> <!-- calls the empty c_tor of the class-->
</Window.DataContext>
</Window>
(我不确定,如果我理解你的问题。但我想,这就是你真正想要的。)
根据你的编辑:
当然你可以做点什么
<!-- Define an instance of your VM in the ResourceDictionary -->
<ResourceDictionary>
<someNs:YourVmClass x:Key="InstOfYourVmClass" />
</ResourceDictionary>
在你看来,你可以做这样的事情。
<Grid>
<Grid.Resources>
<ResourceDictionary Source="Resources\ResourceDictionary.xaml" />
</Grid.Resources>
<Grid.DataContext>
<StaticResource ResourceKey="InstOfYourVmClass" />
</Grid.DataContext>
</Grid>
但我强烈建议不要选择这种方法。问题是,每当您引用此ResourceDictionary
时,当前实例InstOfYourVmClass
将被新的实例化版本覆盖。