WPF弹出窗口选择基于数据绑定类型的模板

时间:2012-08-22 19:00:20

标签: wpf xaml mvvm

有一个包含大量对象的视图,它们从DataTemplate声明中获取它们的视图:

<DataTemplate DataType="{x:Type vm:StatusAViewModel}" >
    <vw:StatusAView />
</DataTemplate>

<DataTemplate DataType="{x:Type vm:StatusBViewModel}" >
    <vw:StatusBView />
</DataTemplate>

现在我想根据要包含的数据类型显示一个包含其内容的弹出窗口:

<Popup AllowsTransparency="True"
       IsOpen="{Binding IsPopupOpen,Mode=OneWay}" 
       PlacementTarget="{Binding PopupPlacementElement}" Placement="{Binding PopupPlacementMode}"
       HorizontalOffset="{Binding PopupHOffset}" VerticalOffset="{Binding PopupVOffset}">
    <ContentPresenter x:Name="StuckHere" Content="{Binding PopupData}" />
</Popup>

StuckHere上的ContentTemplateSelector不起作用,因为它仅评估一次,当PopupData发生更改时,不会重新选择模板。

我能找到的所有示例都依赖于默认的datatemplate,我不能在我的情况下使用,因为我已经为主视图提供了默认的DataTemplate,我只希望这个不同的模板影响我的弹出窗口。 / p>

任何线索?

2 个答案:

答案 0 :(得分:7)

您可以在DataTemplates中应用另一组<Popup.Resources>,这将覆盖在可视树中更高的位置并仅应用于Popup

<Window.Resources>
    <DataTemplate DataType="{x:Type vm:StatusAViewModel}" >
        <vw:StatusAView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:StatusBViewModel}" >
        <vw:StatusBView />
    </DataTemplate>
</Window.Resources>

<Popup>
    <Popup.Resources>
        <DataTemplate DataType="{x:Type vm:StatusAViewModel}" >
            <vw:StatusAPopupView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:StatusBViewModel}" >
            <vw:StatusBPopupView />
        </DataTemplate>
    </Popup.Resources>

    <!-- The DataTeplate used here will be a PopupView, not the regular View -->
    <ContentPresenter Content="{Binding PopupData}" />
</Popup>

答案 1 :(得分:0)

您可以查看http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx。实现从DateTemplateSelector派生的templateselector并使用ContentControl。将内容绑定到DataObject,将ContentTemplateSelectorTemplate绑定到TemplateSelector。