在我的网格中,我有一个列,需要提供一组基本的下拉选项,但用户可以手动编辑。我已经让这部分工作得很好了:
<DataGridTemplateColumn Header="Comment" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DefaultComments}" Text="{Binding Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" VerticalContentAlignment="Center" IsEditable="True" Name="CommentComboBox" Loaded="CommentComboBox_Loaded" Height="50"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我想提供的附加功能是允许多行文本输入,用户可以使用Ctrl-Enter强制换行。
是否可以通过操作ComboBox的TextBox部分来扩展现有列来执行此操作?或者它需要一个完全不同的模板列?
答案 0 :(得分:0)
尝试以下操作允许您在组合框内的文本框中添加多行输入。
将样式添加到资源
这适用于Enter而不是Ctrl-Enter。
<Window.DataContext>
<local:MyComboVM/>
</Window.DataContext>
<Window.Resources>
<SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
<Style x:Key="{x:Type ComboBoxItem}" TargetType="ComboBoxItem">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<Border Name="Border" Padding="2" SnapsToDevicePixels="true">
<StackPanel>
<TextBlock Text="{Binding Path=Text, BindsDirectlyToSource=True}"></TextBlock>
<TextBox TextWrapping="Wrap" AcceptsReturn="True"></TextBox>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ComboBox ItemsSource="{Binding MyCombo}"/>
</Grid>
public class MyComboVM
{
public ObservableCollection<Texts> MyCombo { get; set; }
public MyComboVM()
{
MyCombo = new ObservableCollection<Texts>();
MyCombo.Add(new Texts() { Text = "This is one" });
MyCombo.Add(new Texts() { Text = "This is Two" });
}
}
public class Texts
{
public string Text { get; set; }
}