2017-12-21 6 views
1

ユーザーが積極的に要求するまで、機密情報を隠すDataGridを表示する必要があります。私は、このように列を構築しました:DataGridに新しい行を追加するときにDataTemplateを変更する方法(新しい行のみ)

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

をこの生成する:

enter image description here

をユーザーがそれらがアクセスを監査し、別のビューを示している[表示]ボタンをクリックするととパスワードを変更することができます。

唯一の問題は、新しい行を追加できるようにすることです。パスワードを指定すると、その列はテキストフィールドではないボタンなので、パスワードを指定することはできません。

質問:「新しい行」のボタンをTextBoxに変更しても問題ありませんか?

環境:コードビハインドファイルには何も含まれていないMVVM。それが唯一の方法なら、コードの中にいくつかのものを入れても構いません。

おかげ

SOLUTION

は受け入れ答えは私が必要なものの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

あなたはおそらくこれから移動しましたが、私はこれを見ていて、知りたいのは非常に興味があります。なぜ、複雑なトリガールートを取るのではなく、編集モードのテキストボックスに '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

関連する問題