2012-02-15 5 views
2

DataGrid 랩에서 텍스트 상자를 만들려고했습니다. 나는 그것이 작동하지만 텍스트 바인딩을 깰 것으로 보인다.WPF DataGrid의 TextWrapping 텍스트 상자

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

XAML 나는과 같이 데이터 세트를 사용하여 열 및 행을 추가합니다.

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

0

당신은 당신의 데이터 그리드의 모든 텍스트 상자에 TextWrapping을 추가 찾고 있다면, 나는 그들에 대한 암시 적 스타일을 제안하여 당신이 ContentPresenter 누락하고 있기 때문에 DataGrid.Resources

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

데이터가 사용자의 템플릿에 표시되지 않는 이유입니다. 이 객체는 실제 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

+0

답장을 보내 주셔서 감사합니다! 리소스 부분 만 추가하면 텍스트 상자가 영향을받지 않습니다. 적어도 나는 변화를 느끼지 못한다. ItemsSource를 사용하기 전에 Items 컬렉션이 비어 있어야합니다. " 스타일. 내가 뭘 놓치고 있니? 다시 한번 고마워요. – jfmajor

+0

좋아, XAML 태그가 누락되었습니다. 그래도 텍스트 줄 바꿈이 없습니다. 그리고 셀을 선택하면 텍스트가 사라집니다. – jfmajor