WPF Datagrid - 具有多线功能的可编辑组合框?

时间:2015-07-17 19:14:13

标签: c# wpf datagrid combobox multiline

在我的网格中,我有一个列,需要提供一组基本的下拉选项,但用户可以手动编辑。我已经让这部分工作得很好了:

            <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部分来扩展现有列来执行此操作?或者它需要一个完全不同的模板列?

1 个答案:

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

VM

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