如何绑定到类型Window作为DataTemplate

时间:2013-06-05 13:37:58

标签: wpf mvvm resourcedictionary

我的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时,这是正确的方法。

1 个答案:

答案 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将被新的实例化版本覆盖。