2017-12-21 38 views
1

사용자가 적극적으로 요청할 때까지 일부 중요한 정보를 숨기는 DataGrid를 표시해야합니다.DataGrid에 새 행을 추가하는 동안 DataTemplate을 변경하는 방법 (새 행에만 적용)

표시 버튼을 사용자가 클릭 그들이 액세스 감사 다른보기를 표시됩니다

enter image description here

과 :

<DataGrid.Columns> 
<DataGridTextColumn Header="User Name" Binding="{Binding UserName}" IsReadOnly="False" MinWidth="90"/> 
<DataGridTemplateColumn Header="Password" IsReadOnly="False" MinWidth="90"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Content="Show"            
     Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" 
     CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
<DataGridCheckBoxColumn Header="Owner Only" Binding="{Binding OwnerOnly}" IsReadOnly="{Binding IsOwner, Converter={StaticResource InverseBooleanConverter}}" MinWidth="90"/> 
<DataGridCheckBoxColumn Header="Active" Binding="{Binding Active}" IsReadOnly="False" MinWidth="90"/> 
<DataGridTextColumn Header="Created" Binding="{Binding Created, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" IsReadOnly="True" MinWidth="90"/> 
<DataGridTextColumn Header="Superseded" Binding="{Binding Superseded, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" IsReadOnly="True" MinWidth="90"/> 

이 생산하는 어떤 : 나는 이렇게 열을 구축했습니다 암호를 변경할 수 있습니다.

유일한 문제는 내가 새 행을 추가 할 수있게하려는 것입니다. 그렇게하면 열은 텍스트 필드가 아닌 버튼이기 때문에 비밀번호를 지정할 수 없습니다.

질문 : '새 행'에서 해당 버튼을 TextBox로 변경하는 방법이 있습니까?

환경 : 코드 숨김 파일에 MVVM이 없습니다. 그게 유일한 방법이면 코드 뒤에 물건을 넣는 것도 괜찮습니다.

감사

솔루션

허용 된 대답은 나에게 내가 필요로 무엇의 90 %를 준하지만 두 번째 데이터 트리거를 추가했다 ...

<ContentControl> 
    <ContentControl.Resources> 
     <Button x:Key="btn" Content="Show"            
Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" 
CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/> 
    </ContentControl.Resources> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Content" Value="{StaticResource btn}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Password}" Value="{x:Null}"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <TextBox /> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="{x:Static CollectionView.NewItemPlaceholder}"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <TextBox /> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
    </ContentControl.Style> 
</ContentControl> 
+1

해당 데이터 템플릿 내에 버튼과 텍스트 상자가있을 수 있습니다. 그때는 두 가지의 가시성을 바인딩 할 수 있습니다 : 오래된 항목, 텍스트 상자가 보이면 그 버튼은 새로운 항목이 보일 때 나타납니다 – Milan

+0

당신은 아마 이것에서 계속 전진했을 것입니다. 그러나 저는 이것을 보았고 저는 궁금해서 알고 있습니다 : 왜 didn ' 길게 얽힌 트리거 경로를 취하는 대신 편집 모드 텍스트 상자에'DataGridTemplateColumn.CellEditingTemplate'을 사용하면됩니까? – Maverik

+0

보기를 클릭하면 사용자가 그리드에서 편집하는 것을 허용하지 않는 다른보기 (암호를 읽은 사람을 감사하는 이유)가 열립니다. – RAM

답변

1

당신은 ContentControl를 사용할 수있는 부모 DataContext에 바인드하고 NewItemPlaceholder 인 경우 TextBox을 표시합니다. 다음과 같은 내용이 있습니다.

<DataGridTemplateColumn Header="Password" IsReadOnly="False" MinWidth="90"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ContentControl> 
       <ContentControl.Resources> 
        <Button x:Key="btn" Content="Show"            
             Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" 
             CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/> 
       </ContentControl.Resources> 
       <ContentControl.Style> 
        <Style TargetType="ContentControl"> 
         <Setter Property="Content" Value="{StaticResource btn}" /> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="{x:Static CollectionView.NewItemPlaceholder}"> 
           <Setter Property="Content"> 
            <Setter.Value> 
             <TextBox /> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </ContentControl.Style> 
      </ContentControl> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

유망 해 보이지만 지금은 새해가 끝나기 전입니다 - 돌아 가면 바로 사용하겠습니다. 제대로 작동하면 답변으로 표시합니다. 감사. – RAM

+0

첫 번째 열을 입력하자마자 TextBox가 단추로 되돌아갑니다. 새로운 행은 즉시 NewItemPlaceholder를 잃어 버립니다 (그리고 그 시점에서 대상 클래스의 ctor가 호출되므로 더미 행 홀더에서 새로운 객체로 행이 변경되고있는 것 같습니다). 그래서 ... 널 암호 확인을위한 두 번째 트리거를 추가했는데,이게 옳은 것처럼 보입니다. 내 질문에 현재 사용중인 XAML을 추가했습니다. 감사. – RAM