TextWrapping текстовое поле в WPF DataGrid - PullRequest
2 голосов
/ 16 февраля 2012

Я пытался сделать свои текстовые поля в моей обертке 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 ]

2 голосов
/ 23 февраля 2012

Разобрался. Устанавливая 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 голос
/ 16 февраля 2012

Это вставляет 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();
    }
}
0 голосов
/ 16 февраля 2012

Если вы хотите просто добавить TextWrapping ко всем TextBox в вашей DataGrid, я бы предложил создать для них неявный стиль в 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 - это любой объект, находящийся в ячейке в данный момент, будь то TextBox, TextBlock, ComboBox и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...