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



有一个包含大量对象的视图,这些对象从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,我只希望这个不同的模板影响我的弹出窗口。

有什么线索吗?

您可以在 <Popup.Resources> 中应用一组不同的DataTemplates,这将覆盖可视化树中更高位置定义的并仅应用于该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>
你可以

看看 http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx。实现派生自 DateTemplateSelector 的模板选择器并使用 ContentControl。将内容绑定到数据对象,将内容模板选择器模板绑定到模板选择器。

最新更新