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