WPF DataGrid中的TextWrapping文本框

时间:2012-02-15 20:07:52

标签: c# wpf datagrid

我一直在尝试在DataGrid包装中创建文本框。我得到了它的工作,但它似乎打破了文本绑定。

XAML

<DataGrid x:Name="dataGrid" Grid.Row="0" AutoGenerateColumns="False" ItemsSource="{Binding}">
    <!-- <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <TextBox TextWrapping="Wrap" Text="{Binding Path=Value}">
                        </TextBox>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.CellStyle> -->
</DataGrid>

我使用类似的数据集添加列和行。

CS

    #region Variables
    private DataTable m_stringData = new DataTable();
    private DataSet m_stringDataSet = new DataSet();
    #endregion

    #region Constructors
    public LocEditor()
    {
        InitializeComponent();

        AddColumn("ID", 100);
        AddString("Test");
        dataGrid.DataContext = m_stringData;
    }
    #endregion

    #region Methods

    private void AddColumn(string l_columnName, int l_iWidth)
    {
        m_stringData.Columns.Add(l_columnName, typeof(string));

        dataGrid.Columns.Add(new DataGridTextColumn
        {
            Header = l_columnName,
            Width = l_iWidth,
            Binding = new Binding(l_columnName)
            //Binding = new Binding(string.Format("[{0}]", l_columnName))
        });
    }

    private void AddString(string l_stringID)
    {
        m_stringData.Rows.Add();
        m_stringData.Rows[m_stringData.Rows.Count - 1][0] = l_stringID;
    }

    #endregion

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

想出来。通过设置Element和EditingElementStyle,我不必重置绑定。

DataGridTextColumn l_column = new DataGridTextColumn();
l_column.Header = l_columnName;
l_column.Binding = new Binding(l_columnName);
l_column.Width = l_iWidth;

Style l_textStyle = new Style(typeof(TextBlock));
l_textStyle.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
l_column.ElementStyle = l_textStyle;
Style l_textEditStyle = new Style(typeof(TextBox));
l_textEditStyle.Setters.Add(new Setter(TextBox.TextWrappingProperty, TextWrapping.Wrap));
l_column.EditingElementStyle = l_textEditStyle;

dataGrid.Columns.Add(l_column);

答案 1 :(得分:1)

这会将GridViewColumn直接插入到GridView中,但它对我有用。

<ListView Name="myListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="HEADER NAME" x:Name="header">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox TextWrapping="Wrap" Text="{Binding Path=Value}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

为了完整地查看包装文本,您需要将行的高度设置为足以看到这一点(或动态执行高度转换)。

<My:ToHeightConverter x:Key="heightConverter" />

<Style TargetType="ListViewItem">
    <Setter Property="Height" Value="{Binding ElementName=myListView, Path=ActualHeight, Converter={StaticResource heightConverter}}" />
</Style>

然后在GridView背后的代码中:

[ValueConversion(typeof(double), typeof(double))]
public class ToHeightConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return (((double)value * 10);      //return the height wanted here
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

如果您只想将TextWrapping添加到DataGrid中的所有TextBox,我建议您在DataGrid.Resources

中为它们制作隐式样式
<DataGrid.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="TextWrapping" Value="Wrap" />
    </Style>
</DataGrid.Resources>

数据未显示在您的模板中的原因是因为您错过了ContentPresenter。这是显示实际DataGridCell的呈现内容的对象。 DataGridCell本身不知道其单元格的内容是什么,所以不知道绑定是什么。

例如,这可行

<Style TargetType="DataGridCell">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <TextBlock TextWrapping="Wrap">
                    <ContentPresenter Content="{TemplateBinding Content}" />
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但不是这个

<Style TargetType="DataGridCell">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <TextBox TextWrapping="Wrap" Text="{TemplateBinding Content}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

因为Content是当时在单元格中出现的任何对象,无论是TextBoxTextBlockComboBox等等