Как показать шаблон данных в элементе управления контентом? - PullRequest
8 голосов
/ 22 января 2012

Представьте, что в одном шаблоне данных у меня есть текстовое поле, а в другом шаблоне данных - два текстовых поля.

В соответствии с этим, в представлении есть флажок и показывать каждый шаблон .. это возможно?

Извините, если мой вопрос так сомнителен, я исследовал его, но не выяснил.

Я сделал это, я знаю, что это бесполезно, но только для тестирования.

<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>

Ответы [ 4 ]

26 голосов
/ 22 января 2012

Вместо установки свойства Template попробуйте следующее:

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

6 голосов
/ 02 августа 2012

Вы можете указать один из ваших шаблонов на более низком уровне.Что-то вроде:

<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 голосов
/ 22 января 2012

Ваш дизайн должен включать селектор шаблонов ...

DataTemplates являются чрезвычайно мощной частью WPF, и, используя их, вы можете абстрагировать все виды отображаемого кода. Однако бывают случаи, когда они терпят неудачу - и первоначально, когда я изучал WPF, я был разочарован этим. Например, вы можете установить только один DataTemplate для элемента управления элементами, и хотя это имело смысл, оно чувствовало себя ограниченным. Что если я захочу использовать разные шаблоны в зависимости от содержимого элемента? Нужно ли мне строить всю эту логику в одном шаблоне данных?

источник: Включить код

Это ответ WPF на ваш вопрос, и он должен соответствовать вашему поведению. В учебнике есть несколько ярких примеров, демонстрирующих технику ...


Примечание. Альтернативная ссылка на Учебное пособие по WPF - Как использовать селектор шаблонов данных

0 голосов
/ 14 марта 2017

Я довольно поздно, но у меня возник вопрос, и это мое рабочее решение. Надеюсь, это может помочь другим?

Обратите внимание, что 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>
...