2014-08-28 2 views
0

DataGrid가있는 사용자 정의 컨트롤이있는 프로젝트를 디자인했습니다. 컨트롤의 DataGrid의 일부 열은 Twoway 바인딩을 사용하는 DataGridTextColumn (바인딩 모델에서 데이터를 읽고 쓰는 데 사용)입니다. DataGridTextColumn의 일부 셀에는 매우 긴 텍스트가 포함되어있어 셀에 성공적으로 표시 할 수 없습니다. 이 셀에 스크롤 막대를 넣기로 결정했습니다. 모든 셀 열에는 사용자 정의 스타일이 포함되어 있으므로 DataGridCell 템플리트 대체 템플릿으로 직접 만들 수 있습니다. 는 여기있다 :WPF Toolkit 스크롤 막대가있는 DataGridTextColumn

<Style x:Key="DataGridTextColumnWithScrollBar" TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type wpf_toolkit:DataGridCell}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Control}"> 
       <ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Mode=TwoWay}"> 
        <ContentPresenter.ContentTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Path=Text, Mode=TwoWay}" 
            TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" 
            VerticalAlignment="Stretch" Margin="2,0" BorderThickness="0"/> 
         </DataTemplate> 
        </ContentPresenter.ContentTemplate> 
       </ContentPresenter> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

스타일 DataGridTextColumnWithScrollBar는 기본 데이터 그리드 텍스트 열 셀 스타일과 합병. 그것은 잘 작동하지만 텍스트를 편집 할 수 없습니다 (모든 스크롤이 나타납니다,하지만 텍스트를 편집 한 후 모델이 업데이트되지 않습니다). 내 문제를 해결할 수있는 해결책이 있습니까? 나는 여러 가지 방법을 시도했는데 (예를 들어, WPF Nested binding in a controltemplate) 아무 것도 작동하지 않습니다 ...

P. 컨트롤은 외부 dll 라이브러리에 저장되어 있기 때문에 datagridtext 열을 datatemplate textcolumn 변경할 수 없습니다.

미리 감사드립니다. 여기

+0

아마도 셀 템플릿과 셀 편집 템플릿에 대해 두 개의 별도 템플릿을 정의해야합니다. 둘 다를 위해 같은 것을 사용하면 이러한 문제가 발생할 수 있습니다. 이 템플릿을 사용하는 방법에 대한 코드를 좀 더 공유해도 될까요? – pushpraj

+0

이 스타일을 기본 스타일로 병합하여 datagridtextcolumn cellstyle 속성에 연결되는 내용. 셀 템플릿 및 셀 편집 템플릿에 대한 예제 템플릿을 보여줄 수 있습니까? – ArhiChief

+0

이 코드 만 있습니다. ArhiChief

답변

0

는 내가 템플릿을 제거했는지주의, 문제

에게 스타일을 해결할 수있는 방법이며,이 스타일은 CellStyle 사용하는 대신, 다음 TextBox

<Style x:Key="DataGridTextColumnWithScrollBar" 
      TargetType="{x:Type TextBox}" 
      BasedOn="{StaticResource {x:Type TextBox}}"> 
     <Setter Property="VerticalScrollBarVisibility" 
       Value="auto" /> 
     <Setter Property="TextWrapping" 
       Value="Wrap" /> 
     <Setter Property="VerticalAlignment" 
       Value="Stretch" /> 
     <Setter Property="Margin" 
       Value="2,0" /> 
     <Setter Property="BorderThickness" 
       Value="0" /> 
    </Style> 

사용량을 대상으로 EditingElementStyle

<wpf_toolkit:DataGridTextColumn Header="Some long text 2" 
            Binding="{Binding SomeLongText1, Mode=TwoWay}" 
            EditingElementStyle="{StaticResource DataGridTextColumnWithScrollBar}" /> 

일반보기의 스타일을 지정하고 다음 스타일을 추가하려는 경우

<Style x:Key="DataGridTextBlockColumnWithWrap" 
      TargetType="{x:Type TextBlock}" 
      BasedOn="{StaticResource {x:Type TextBlock}}"> 
     <Setter Property="TextWrapping" 
       Value="Wrap" /> 
     <Setter Property="VerticalAlignment" 
       Value="Stretch" /> 
     <Setter Property="Margin" 
       Value="2,0" /> 
    </Style> 

사용


여기에서 논의 된 바와 같이 편집

기반 스타일입니다

<wpf_toolkit:DataGridTextColumn Header="Some long text 2" 
            Binding="{Binding SomeLongText1, Mode=TwoWay}" 
            EditingElementStyle="{StaticResource DataGridTextColumnWithScrollBar}" 
            ElementStyle="{StaticResource DataGridTextBlockColumnWithWrap}" /> 
당신은뿐만 아니라 비 편집 모드 스크롤 막대를 추가 할 템플릿을 사용할 수 있습니다

명시 적 바인딩이있는 트리거시

<Style x:Key="DataGridTextColumnWithScrollBar" 
      TargetType="{x:Type wpf_toolkit:DataGridCell}" 
      BasedOn="{StaticResource {x:Type wpf_toolkit:DataGridCell}}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type wpf_toolkit:DataGridCell}"> 
        <Grid Background="{TemplateBinding Background}"> 
         <ScrollViewer VerticalScrollBarVisibility="Auto" 
             x:Name="view"> 
          <TextBlock Text="{Binding SomeLongText1}" 
             TextWrapping="Wrap" /> 
         </ScrollViewer> 
         <TextBox Text="{Binding SomeLongText1}" 
           TextWrapping="Wrap" 
           VerticalScrollBarVisibility="Auto" 
           VerticalAlignment="Stretch" 
           Margin="2,0" 
           BorderThickness="0" 
           x:Name="edit" 
           Visibility="Collapsed" /> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEditing" 
           Value="True"> 
          <Setter Property="Visibility" 
            TargetName="view" 
            Value="Collapsed" /> 
          <Setter Property="Visibility" 
            TargetName="edit" 
            Value="Visible" /> 
         </Trigger> 

        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

명시 적 바인딩이 사용되고 있음을 볼 수 있으므로 모든 열에 스타일을 만들어야합니다. 사용이 사용자 정의 템플릿을 사용하면

또는 정직으로 당신이

<Style x:Key="DataGridTextColumnWithScrollBar" 
      TargetType="{x:Type wpf_toolkit:DataGridCell}" 
      BasedOn="{StaticResource {x:Type wpf_toolkit:DataGridCell}}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type wpf_toolkit:DataGridCell}"> 
        <TextBox Text="{Binding SomeLongText1}" 
          TextWrapping="Wrap" 
          VerticalScrollBarVisibility="Auto" 
          VerticalAlignment="Stretch" 
          Margin="2,0" 
          BorderThickness="0"/> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

사용할 수 있습니다 F2를 눌러야 편집 모드로 얻는 것입니다 그러나 이후 동일하게 유지하지만, 명시 적 편집이 없기 때문에 모드를 사용하면 데이터 불일치가 발생할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 그것은 작동하지만 셀이 편집되지 않을 때 스크롤바가 없기 때문에 모든 텍스트가 편집 모드에서만 보입니다. 하지만 내 프로젝트의 일부 그리드는 읽기 전용입니다. 왜 내가 세포의 모든 모드 (편집하고 편집하지 않는)에 대한 스크롤을 만드는 것에 대해 질문하는 이유는 무엇인가. – ArhiChief

+0

제 버전의 예제가 제가 원하는대로 만들었지 만, 방해받은 모델 – ArhiChief

+0

을 업데이트하지 마십시오. 실제로 유혹을 통해 가능합니다. 그래서 스크롤바에 textblock이있는 템플릿을 사용하고 대답의 편집 스타일을 사용하면 두 가지 이점을 모두 얻을 수 있습니다. – pushpraj

0

대답은 매우 간단했습니다.

<Style x:Key="DataGridTextColumnWithScrollBar" TargetType="{x:Type wpf_toolkit:DataGridCell}" 
      BasedOn="{StaticResource {x:Type wpf_toolkit:DataGridCell}}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type wpf_toolkit:DataGridCell}"> 
        <TextBox Name="txtBox" Text="{Binding Content.Text, 
         RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
          VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" 
          IsReadOnly="{TemplateBinding IsReadOnly}"/> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

그래서 나는 다음과 같이 사용할 수 있습니다 :

<wpf_toolkit:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items, Mode=TwoWay}" 
          RowStyle="{StaticResource DataGridRowMaxHeihgt }" ColumnWidth="*" 
          IsReadOnly="True"> 

     <wpf_toolkit:DataGrid.Columns> 
      <wpf_toolkit:DataGridTextColumn Header="Some long text 2" IsReadOnly="True" 
              Binding="{Binding SomeLongText1, Mode=TwoWay}" 
              CellStyle="{StaticResource DataGridTextColumnWithScrollBar}"/> 
      <wpf_toolkit:DataGridTextColumn Header="Some long text 2" 
              Binding="{Binding SomeLongText2, Mode=TwoWay}" IsReadOnly="False" 
              CellStyle="{StaticResource DataGridTextColumnWithScrollBar}"/> 
     </wpf_toolkit:DataGrid.Columns> 
    </wpf_toolkit:DataGrid> 

그것은 내가 원하는 모든 것을 만들어 여기 How to use TwoWay binding from within a UserControl? 여기 WPF TemplateBinding vs RelativeSource TemplatedParent

내 문제에 대답 gived들에 대한 감사는 다음 코드에 의해 해결 .

P. 답변 해 주셔서 감사합니다.

+0

하지만 셀에는 IsReadOnly = "True"속성이 있어야합니다. 생각했던 것처럼 매우 이상합니다 ... – ArhiChief