ОК, Так что я не знаю, возможно ли это, но? Я пытаюсь заполнить DataGrid (точнее, Telerik RadGridView) и хочу динамически определять элементы управления редактированием. Я пытаюсь создать сетку для отображения данных, которые импортируются в приложение, и отображать три столбца (имя свойства, входящие данные и текущие данные базы данных). Основываясь на свойстве в моем классе объектов, в столбце «Имя свойства» должен быть установлен флажок CheckBox. Это следует за другими столбцами до условного добавления кнопки, чтобы можно было выполнить поиск (TextBox или TextBlock были бы перед кнопкой, чтобы отобразить текущее значение). Надеюсь, это объясняет, что я пытаюсь сделать. Ниже приведен XAML.Как наследовать DataTemplate в другом DataTemplate
О, это входит в приложение WPF MVVM C#.
Спасибо за любую помощь, которую вы можете предоставить.
<UserControl x:Class="PulseHL7Importer.Views.DetailView"
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:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:p="clr-namespace:PulseHL7Importer.Properties"
xmlns:fw="clr-namespace:PulseHL7Importer.Framework"
xmlns:vm="clr-namespace:PulseHL7Importer.ViewModels"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="961">
<UserControl.Resources>
<telerik:BooleanToVisibilityConverter x:Key="BooleanVisibilityConverter" />
<DataTemplate x:Key="AddCheckBox">
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding HasCheckBox}" Value="True" />
</DataTemplate.Triggers>
<CheckBox IsChecked="{Binding IsChecked}" Margin="2,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Center" />
</DataTemplate>
<DataTemplate x:Key="AddTextBlock">
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsReadOnly}" Value="True" />
</DataTemplate.Triggers>
<TextBlock Text="{Binding Value}" />
</DataTemplate>
<DataTemplate x:Key="AddTextBox">
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsReadOnly}" Value="False" />
</DataTemplate.Triggers>
<TextBox Text="{Binding Value}" />
</DataTemplate>
<DataTemplate x:Key="AddButton">
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding HasLookup}" Value="True" />
</DataTemplate.Triggers>
<Button Content="..." Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"
VerticalAlignment="Center" HorizontalAlignment="Center"/>
</DataTemplate>
<DataTemplate x:Key="ConditionalTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" Content="{Binding}" ContentTemplate="{StaticResource AddCheckBox}" />
<ContentPresenter Grid.Column="1" Content="{Binding}" ContentTemplate="{StaticResource AddTextBlock}" />
<ContentPresenter Grid.Column="1" Content="{Binding}" ContentTemplate="{StaticResource AddTextBox}" />
<ContentPresenter Grid.Column="2" Content="{Binding}" ContentTemplate="{StaticResource AddButton}" />
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid d:DataContext="{d:DesignInstance vm:DetailViewModel}">
<telerik:RadDockPanel Width="Auto">
<!-- Toolbar -->
<telerik:RadDockPanel telerik:RadDockPanel.Dock="Top">
<telerik:RadToolBar OverflowButtonVisibility="Collapsed" />
</telerik:RadDockPanel>
<!-- Warnings and Errors -->
<telerik:RadDockPanel telerik:RadDockPanel.Dock="Bottom">
<telerik:GroupBox Header="Warnings and Errors"
telerik:Theming.Theme="{Binding Source={x:Static p:Settings.Default}, Path=SelectedTheme}">
<TextBox Height="60" IsReadOnly="True"
VerticalScrollBarVisibility="Auto"
Background="FloralWhite" />
</telerik:GroupBox>
</telerik:RadDockPanel>
<!-- Grid Area -->
<telerik:RadDockPanel Width="Auto">
<telerik:RadGridView Name="DetailGridView" Width="Auto" AutoGenerateColumns="False" RowIndicatorVisibility="Collapsed"
CanUserDeleteRows="False" CanUserInsertRows="False" CanUserReorderColumns="False"
CanUserSortColumns="False" IsFilteringAllowed="False" ColumnWidth="*"
ShowGroupPanel="False" ItemsSource="{Binding Path=Properties}" >
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Path=Value}">
<telerik:GridViewDataColumn.CellTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource ConditionalTemplate}" Content="{Binding Path=Properties}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>
<telerik:GridViewDataColumn.CellEditTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource ConditionalTemplate}" Content="{Binding Path=Properties}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellEditTemplate>
</telerik:GridViewDataColumn>
<telerik:GridViewDataColumn Header="Client Data" DataMemberBinding="{Binding Path=ClientData.Value}">
<telerik:GridViewDataColumn.CellEditTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource ConditionalTemplate}" Content="{Binding Path=ClientData}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellEditTemplate>
</telerik:GridViewDataColumn>
<telerik:GridViewDataColumn Header="Pulse Data" DataMemberBinding="{Binding Path=PulseData.Value}">
<telerik:GridViewDataColumn.CellEditTemplate>
<DataTemplate>
<ContentPresenter ContentTemplate="{StaticResource ConditionalTemplate}" Content="{Binding Path=PulseData}" />
</DataTemplate>
</telerik:GridViewDataColumn.CellEditTemplate>
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</telerik:RadDockPanel>
</telerik:RadDockPanel>
</Grid>
Ну я думаю, что это имеет больше общего с отображением одного или нескольких элементов управления условно. В основном это работает с тем исключением, что отображаются все различные элементы управления (CheckBox, TextBox и Button). Поэтому я думаю, что реальный вопрос заключается в том, как я могу отображать только определенные элементы управления? – dhamilton
@dhamilton: Ну, вы обычно различаете по типу и выбираете подходящий элемент управления/шаблона. Для этого можно использовать 'ContentTemplateSelector'. –
Ну, я пытался немного переработать это и думаю, что у меня есть разумное решение под рукой. Я считаю, что это сводит меня к решению привязки между моей сеткой и шаблонами данных, которые выбираются. В основном у меня есть класс «Свойства», этот класс имеет некоторые свойства, которые управляют первым столбцом моей сетки. Он также имеет некоторые свойства (ClientData и PusleData), которые являются подклассами; которые используются в моих последних двух столбцах.Моя проблема заключается в том, что в селекторе шаблонов и сам шаблон привязывается к «Свойствам», а не к «ClientData» и «PulseData». Вот код. – dhamilton