Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF数据网格中包装文本框_C#_Wpf_Datagrid - Fatal编程技术网

C# 在WPF数据网格中包装文本框

C# 在WPF数据网格中包装文本框,c#,wpf,datagrid,C#,Wpf,Datagrid,我一直在尝试将我的文本框包装在我的DataGrid中。我让它工作,但它似乎打破了文本绑定 XAML 任何帮助都将不胜感激。这将把GridViewColumn直接插入GridView,但它对我很有用 <ListView Name="myListView"> <ListView.View> <GridView> <GridViewColumn Header="HEADER NAME" x:Name="heade

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

XAML


任何帮助都将不胜感激。

这将把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>

如果您希望只向DataGrid中的所有文本框添加TextWrapping,我建议在
DataGrid.Resources中为它们创建一个隐式样式

<DataGrid.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="TextWrapping" Value="Wrap" />
    </Style>
</DataGrid.Resources>
但不是这个

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


因为
内容
是当时单元格中碰巧存在的任何对象,无论它是
文本框
文本块
组合框
,等等

都能解决这个问题。通过设置元素和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);

问题是我不知道最后会有多少列。所以我的DataTable必须为我做这项工作。我无法在XAML中静态创建列。谢谢,谢谢你的回复!如果我只是添加资源部分,我的文本框似乎不会受到影响。至少我没有注意到任何变化。我得到了一个“在使用ItemsSource之前Items集合必须为空”的样式。我错过了什么?再次感谢。好的,我丢失了一些XAML标签。仍然没有文字包装虽然。当我选择单元格时,文本将消失。
[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();
    }
}
<DataGrid.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="TextWrapping" Value="Wrap" />
    </Style>
</DataGrid.Resources>
<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>
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);