2012-02-15 70 views
2

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

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 

任何帮助将不胜感激。

回答

2

想通了。通过设置Element和EditingElementStyle,我不必重置Binding。

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

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

问题是我不知道我会有多少列结束。所以我的DataTable必须为我做这个工作。我无法在XAML中静态创建我的列。不过谢谢。 – jfmajor 2012-02-15 20:52:54

0

如果你正在寻找只需添加TextWrapping在你的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是什么对象恰好是在小区的时候,无论是TextBoxTextBlockComboBox

+0

感谢您的回复!如果我只是添加资源部分,我的文本框似乎不受影响。至少我没有注意到任何改变。我收到一个“使用ItemsSource之前项目集合必须为空”。与风格。我错过了什么?再次,非常感谢。 – jfmajor 2012-02-15 21:14:21

+0

好吧,我错过了一些XAML标签。尽管如此,仍然没有文字包装。当我选择单元格时,文本会消失。 – jfmajor 2012-02-15 21:24:43