如何在内容控件上显示数据模板?

12

假设在一个数据模板中,有一个文本框,而在另一个数据模板中,有两个文本框。

根据这个情况,在视图中有一个复选框,并显示每个模板..是否可能实现?

如果我的问题不够清楚,我很抱歉,我已经调查过了,但没有找到答案。

我曾这样做过,我知道这是无用的,但只是为了测试。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <DataTemplate DataType="{x:Type ContentControl}" x:Key="T1">
            <StackPanel>
                <TextBox Height="20" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type ContentControl}" x:Key="T2">
            <StackPanel>
                <TextBox Height="20" />
                <TextBox Height="20" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>


    <Grid>
        <ContentControl Template="{StaticResource T1}" />
    </Grid>
</Window>

好的。你提到的复选框在哪里? - Gayot Fow
@GarryVass 是的,我还没有做到那一步。我首先要手动实现模板到内容控件的方式...目前复选框不是问题。 - Darf Zon
4个回答

33

不要设置 Template 属性,试试这个:

<ContentControl ContentTemplate="{StaticResource T1}" />


1
太好了,这个可行!有一个问题,为了让复选框更改模板,我应该使用数据模板选择器吗? - Darf Zon
1
抱歉,我不是模板选择器方面的专家。也许Gary Vass的回答能帮助你找到正确的方向。 - JayP

6
您可以在较低级别上指定其中一个模板。就像这样:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <DataTemplate DataType="{x:Type ContentControl}" x:Key="T1">
            <StackPanel>
                <TextBox Height="20" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>


    <Grid>
        <ContentControl Template="{StaticResource T1}">
            <ContentControl.Resources>
                <DataTemplate DataType="{x:Type ContentControl}" x:Key="T2">
                    <StackPanel>
                        <TextBox Height="20" />
                        <TextBox Height="20" />
                    </StackPanel>
                </DataTemplate>
            <ContentControl.Resources>
        </ContentControl>
    </Grid>
</Window>

2
您的设计应该包括一个模板选择器...
DataTemplates是WPF的一个非常强大的部分,通过使用它们,您可以抽象出各种显示代码。然而,有时它们会不够用 - 当我学习WPF时,我对此感到失望。例如,在items控件上只能设置一个DataTemplate,虽然这很有道理,但感觉有限制。如果我想根据项目内容使用不同的模板怎么办?我必须在单个数据模板中构建所有逻辑吗?
来源:Switch on the code 这是WPF对您问题的答案,并且应该产生您所需的行为。该教程有一些清晰的示例来展示该技术...
注意:WPF教程 - 如何使用数据模板选择器的备用链接。

谢谢Gary,这对我有用,感谢你的指导。明天我会发布解决方案。 - Darf Zon
@DarfZon,一切都好,不需要发布解决方案。 - Gayot Fow
1
@Vikram,感谢您的提醒。我想这在4年前已经是不可避免的了。您能否尝试一下我刚刚编辑到答案中的另一种方法? - Gayot Fow
@Vikram如果你得到了一个非常好的结果,考虑回来给出答案,人们可以从有实战经验的人那里受益。 - Gayot Fow
1
这就是为什么你绝对不应该在StackOverflow的答案中添加链接的原因:它们会失效,因此这个答案现在完全没有用处。 - Oyvind

1

虽然有点晚,但我已经得到了问题,并且这是我的解决方案。希望能对其他人有所帮助?

请注意,local:UserControlSpecialSignalTtrModel继承自SignalProviderSpecial。

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ParametricStudyAnalysis.ScopeSelection.Special"
             xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid" x:Class="ParametricStudyAnalysis.ScopeSelection.Special.UserControlAddSpecialSignal"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.DataContext>
        <local:UserControlAddSpecialSignalModel></local:UserControlAddSpecialSignalModel>
    </UserControl.DataContext>

    <UserControl.Resources>
        <DataTemplate DataType="{x:Type local:UserControlSpecialSignalTtrModel}">
            <local:UserControlSpecialSignalTtr/>
        </DataTemplate>     
    </UserControl.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>


        <GroupBox Header="Signal type" Grid.Row="0" Padding="5">
            <xcdg:DataGridControl Name="DataGrid" SelectionMode="Single" ItemsSource="{Binding SpecialSignalEntries}"
                              SelectedItem="{Binding SpecialSignalEntrySelected}" Height="200">
            <xcdg:DataGridControl.Columns>
                <xcdg:Column FieldName="Name" Title="Type of special signal" ReadOnly="True"></xcdg:Column>
            </xcdg:DataGridControl.Columns>
        </xcdg:DataGridControl>
        </GroupBox>

        <GroupBox Header="Parameters" Grid.Row="1" Margin="0,3,0,0" Padding="5">
            <ContentControl Name="MyContentControl" 
                            DataContext="{Binding SpecialSignalEntrySelected, Mode=OneWay}" 
                            Content="{Binding SignalProviderSpecial}">
            </ContentControl>
        </GroupBox>
    </Grid>
</UserControl>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接