我想将特定列的单元格设置为组合框或文本框,具体取决于Datagrid的itemsource的属性。我怎样才能实现这一目标?每个rowitem都有一个ParameterType属性:
public enum ParameterType
{
Bool,
Int,
Double,
String,
DateTime,
Severity
}
如果它是Bool我想要显示一个带有true和false的Combobox,如果是int,double,string - 一个Textbox。 如果DateTime理想情况下是DateTimePicker,并且Severity是一个具有不同严重性值的Combobox。
我无法弄清楚如何更改DatagridColumn来实现这个目标....
修改
我们提出了这个想法但是指定的DataTemplateSelector似乎没有被调用 - 我已经在SelectTemplate的第一次调用中设置了一个断点,但它没有在那里启动调试。
DataTemplateSelector:
public class InstructionsEditParameterTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultTemplate { get; set; }
public DataTemplate SeverityTemplate { get; set; }
public DataTemplate IntTemplate { get; set; }
public DataTemplate BoolTemplate { get; set; }
public DataTemplate DateTimeTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var fpd = item as FunctionParameterDescription;
if (fpd == null)
return base.SelectTemplate(item, container);
switch (fpd.ParamType)
{
case FunctionParameterDescription.ParameterType.Severity:
return SeverityTemplate;
case FunctionParameterDescription.ParameterType.Bool:
return BoolTemplate;
case FunctionParameterDescription.ParameterType.DateTime:
return DateTimeTemplate;
case FunctionParameterDescription.ParameterType.Int:
return IntTemplate;
default:
return DefaultTemplate;
}
}
DataGridTemplateColumn:
<DataGridTemplateColumn Header="Header">
<DataGridTemplateColumn.CellEditingTemplateSelector>
<!-- not yet called... -->
<Configurator:InstructionsEditParameterTemplateSelector
DefaultTemplate="{StaticResource StringItemTemplate}"
DateTimeTemplate="{StaticResource DateItemTemplate}"
BoolTemplate="{StaticResource BoolItemTemplate}"
SeverityTemplate="{StaticResource SeverityItemTemplate}"/>
</DataGridTemplateColumn.CellEditingTemplateSelector>
资源:
<UserControl.Resources>
<DataTemplate x:Key="SeverityItemTemplate">
<ComboBox ItemsSource="{Binding ElementName=root, Path=Model.ParameterSeverityItems}"
DisplayMemberPath="Type" SelectedValuePath="ParamType" />
</DataTemplate>
<DataTemplate x:Key="StringItemTemplate">
<TextBox Text="{Binding Value}" />
</DataTemplate>
<DataTemplate x:Key="DateItemTemplate">
<DatePicker Text="{Binding Value}" />
</DataTemplate>
<DataTemplate x:Key="BoolItemTemplate">
<TextBox Text="{Binding Value}" />
</DataTemplate>
</UserControl.Resources>
好了,现在我感觉有点愚蠢...它只是没有被调用,因为DataGrid的IsReadOnly属性没有被设置为“false”......这实际上是一个例子现在你如何使它工作:d
答案 0 :(得分:1)
稍微从我的评论中扩展这个想法,您可以从MSDN上的DataGridTemplateColumn
Class页面(从该页面改编的代码示例)中找到DataGridTemplateColumn
的帮助:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="DataTemplate" >
<Grid>
<TextBox Text="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=Int}" />
<DateTimePicker SelectedDate="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=DateTime}" />
<ComboBox SelectedItem="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=Bool}">
<ComboBox.Items>
<ComboBoxItem>True</ComboBoxItem>
<ComboBoxItem>False</ComboBoxItem>
</ComboBox.Items>
<ComboBox>
... <!--Complete this yourself-->
</Grid>
</DataTemplate>
</Grid.Resources>
<DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Some column" CellTemplate="{StaticResource DataTemplate}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
我还在网上找到了EnumToVisibilityConverter
课程: