如何使用DataTemplates在运行时将通用窗口绑定到任意视图模型?

时间:2010-07-29 14:13:08

标签: wpf data-binding mvvm datatemplate

我有大量的ViewModel类。对于这些类中的每一个,都有一个相应的.xaml文件,它是一个'UserControl'。在我的App.xaml中,我将它们注册为DataTemplates,如下所示:

<DataTemplate DataType="{x:Type viewModel:MainMenuViewModel}">
     <view:MainMenuView/>
</DataTemplate>

理念是WPF将能够在运行时自动交换必要的用户控件。例如,这有效:

 <Grid>
    <StackPanel>
    <TextBlock Text="SuperApp" />
        <ItemsControl>
            <ViewModels:MainMenuViewModel/>
        </ItemsControl>
   </StackPanel>
</Grid>

因为条目“MainMenuViewModel”被MainMenuView自动替换,绑定到MainMenuViewModel。大。我现在的目标是这样的:我想要一个按钮,例如,嵌入在MainMenuView中的视图,它打开一个弹出窗口,里面会有一个新的ViewModel。我的想法是设置它,以便我有一个“通用”弹出窗体,其中我嵌入了一个任意的ViewModel,让WPF处理实际上使用DataTemplates渲染它,类似于上面的。所以我有一个命令绑定到一个按钮,如下所示:

<Button Command="{Binding Path=LaunchInStandaloneForm}" Content="Rip Out"/>

成功创建一个新窗口,将dataContext设置为等于相应的ViewModel,并显示该窗口。

问题是:如何设置此弹出窗口的XAML,以便为ViewModel(DataContext)呈现相应的DataTemplate?我试过了:

 <Grid>
    <ItemsControl ItemsSource="{Binding Path=.}">

    </ItemsControl>
</Grid>

,但它出现了空白。有什么指针吗?

2 个答案:

答案 0 :(得分:1)

要将ItemsSource设置为DataContext,请使用ItemsSource={Binding}。这假定DataContext是View Model对象的可枚举集合。

使用正确答案进行更新:

使用ContentControl:)

希望有所帮助。

答案 1 :(得分:0)

此处接受的答案显示了如何在运行时更改模板。你应该能够从中找出答案。任何问题都会大喊大叫。

How to modify silverlight combobox data display

希望有所帮助