2012-02-15 128 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