c# - 更改 ContentPresenter 的 DataTemplate

标签 c# windows-phone-8 mvvm contentpresenter datatemplateselector

我有一个弹出窗口,我想根据单击的各种按钮显示不同的内容。为此,我在这个 ContentPresenter 中添加了一个 ContentPresenter nad 我有一个 TemplateSelector。我的问题是,据我所知,它只检查第一次运行我的 popUp 时使用哪个模板,并从那时起使用这个模板。有没有办法让代码更改要使用的模板?

到目前为止我得到的代码是(xaml):

  <Popup IsOpen="{Binding IsOpen}" Height="{Binding Height}" Width="{Binding Width}">

        <Grid>
            <ContentPresenter x:Name="CP" Loaded="CP_Loaded">
                    <ViewModel:PopUpTemplateSelector x:Name="PUT" Content="{Binding}">
                        <ViewModel:PopUpTemplateSelector.View1>
                            <DataTemplate>
                                <View:View1/>
                            </DataTemplate>
                        </ViewModel:PopUpTemplateSelector.View1>
                        <ViewModel:PopUpTemplateSelector.View2>
                            <DataTemplate>
                                <View:View2/>
                            </DataTemplate>
                        </ViewModel:PopUpTemplateSelector.View2>
                        <ViewModel:PopUpTemplateSelector.View3>
                            <DataTemplate>
                                <View:View3/>
                            </DataTemplate>
                        </ViewModel:PopUpTemplateSelector.View3>
                        <ViewModel:PopUpTemplateSelector.View4>
                            <DataTemplate>
                                <View:View4/>
                            </DataTemplate>
                        </ViewModel:PopUpTemplateSelector.View4>
                        <ViewModel:PopUpTemplateSelector.View5>
                            <DataTemplate>
                                <Design:View5/>
                            </DataTemplate>
                        </ViewModel:PopUpTemplateSelector.View5>
                    </ViewModel:PopUpTemplateSelector>
            </ContentPresenter>
        </Grid>
    </Popup>

我的 popUpTemplateSelector(C#) 是
    public class PopUpTemplateSelector : DataTemplateSelector
{
    public DataTemplate View1{ get; set; }
    public DataTemplate View2 { get; set; }
    public DataTemplate View3 { get; set; }
    public DataTemplate View4 { get; set; }
    public DataTemplate View5 { get; set; }


    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {

        PopUpViewModel Pop = item as PopUpViewModel;

        if(Pop.TemplateToUse == "View1")
        {
            return View1;
        }
        else if(Pop.TemplateToUse == "View2")
        {
            return View2;
        }
        else if(Pop.TemplateToUse.Equals("View3"))
        {
            return View3;
        }
        else if (Pop.TemplateToUse.Equals("View4"))
        {
            return View4;
        }
        else if(Pop.TemplateToUse.Equals("View5"))
        {
            return View5;
        }

        return null;
    }   

}

最佳答案

我建议您使用绑定(bind)到 TemplateToUse 的 DataTriggers ViewModel 上要更新的属性 ContentTemplate .也可以使用 ContentControl而不是 ContentPresenter

 <Popup IsOpen="{Binding IsOpen}" Height="{Binding Height}" Width="{Binding Width}">
    <Grid>
        <Grid.Resources>
            <DataTemplate x:Key="View1Template">
                <View:View1/>
            </DataTemplate>
            <DataTemplate x:Key="View2Template">
                <View:View2/>
            </DataTemplate>
            <DataTemplate x:Key="View3Template">
                <View:View3/>
            </DataTemplate>
            <DataTemplate x:Key="View4Template">
                <View:View4/>
            </DataTemplate>
            <DataTemplate x:Key="View5Template">
                <Design:View5/>
            </DataTemplate>

            <Style x:Key="ContentStyle" TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=TemplateToUse}" Value="View1">
                        <Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=TemplateToUse}" Value="View2">
                        <Setter Property="ContentTemplate" Value="{StaticResource View2Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=TemplateToUse}" Value="View3">
                        <Setter Property="ContentTemplate" Value="{StaticResource View3Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=TemplateToUse}" Value="View4">
                        <Setter Property="ContentTemplate" Value="{StaticResource View4Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=TemplateToUse}" Value="View5">
                        <Setter Property="ContentTemplate" Value="{StaticResource View5Template}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
       </Grid.Resources>

       <ContentControl x:Name="CP" Loaded="CP_Loaded" Style="{StaticResource ContentStyle}" Content="{Binding}" />
    </Grid>
</Popup>

关于c# - 更改 ContentPresenter 的 DataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940369/

相关文章:

windows-8 - Windows phone 8 SDK 安装问题

c# - 将 DataTemplate 中的 WPF RelayCommand 绑定(bind)到 UserControl 内的按钮

c# - 从 C# 访问 Firefox

c# - 如何在 MVC 中使用 GET 方法进行搜索

c# - 在 SQL 代理作业中运行 C# 代码

windows-phone-7 - Windows Phone 8 中的 CameraCaptureTask - 自动保存到相机胶卷

c# - 读取 INI 文件的特定部分 C#

windows-phone-8 - 开发人员解锁Windows Phone 8 : Error Code 0x64

c# - 将文本框绑定(bind)到 View 模型中的对象

c# - MVVM C#​​ 如何将异步数据加载到属性中?