2011-06-17 2 views
2

だから私は列は次のように定義されています:TextBoxの列のためのDataTemplateで存在することができる唯一のコントロールではありませんWPF DataGrid:TextBoxなどのDataRowにアクセスするにはどうすればよいですか?

     <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBox Text="{Binding Path=COLUMN_NAME, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 

、私はDateTimePickers、コンボボックスなど

そして、何が欲しいを持っています行うには、いくつかのスタイルがのDataRowにいくつかのプロパティにアクセスすること、このようにトリガーを定義です:

  <Style TargetType="{x:Type TextBox}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, 
         Path=Row.RowState}" Value="Modified"> 
         <Setter Property="Foreground" Value="LightGreen" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 

今、残念ながらテキストボックスがDataGridRowsの論理的な子供たちは決してありません表示されます。だから、解決策は何ですか?もちろん、DataGridRows自体をターゲットとするトリガーを作成することはできますが、前景プロパティを設定すると何も行われないため(TextBoxなどのコントロールが前面に表示されるため)、これは冗長です。

ご迷惑をおかけして申し訳ございません。 Fugu

EDIT:RowStateはリスナーに通知せず、DataRowの拡張に問題があるため、ここでは私が選択したソリューションです。

1)データが変更されたときのために、コントロールにイベントをバインドします。 2)再度、RowStateをチェックするためにスタイルを更新:

 Style s = ((TextBox)sender).Style; 
     ((TextBox)sender).Style = null; 
     ((TextBox)sender).Style = s; 

もちろん、それはそれ以上の汎用行われます。

編集2:私は、個別に各コントロールのスタイルをリセットする必要があると思いますので、これは露骨に動作しませんそれはあなたがDataGridCellで欲しい

+0

RelativeSourceバインディングが問題ですか? DataGridRow.Row.RowStateにアクセスできない場合や、RowStateが文字列と比較される列挙型なので、常にfalseが返される可能性があります。私が使用したい簡単なテストは、RelativeSourceにツールヒントを設定して、何かが現れるかどうかを確認することです。 – Rachel

+0

これを試してください:http://www.codearsenal.net/2012/07/wpf-datagrid-rowdetailstemplate.html –

答えて

0

は、以下を参照してください。

https://stackoverflow.com/questions/4947918/wpftoolkit-datagrid-highlight-modified-rows

を限り結合として、がDataGridRowのプロパティではありません、あなたはDataContext.Row.RowStateを使用する必要がありますので。

これでWPFはRowStateプロパティの変更を検出できないため、DataTableに直接バインドするのではなく、ビューモデルでアイテムをラップすることをお勧めします。

+0

ありがとうございました。 RowStateの変更を検出することが難しいため、イベントを使用してスタイルをリフレッシュすることを選択しました。私が行った解決策を反映するように私の投稿を更新しました。 – Fugu

1

を行うには悪いことだろうことが可能であったとしても、スタイリングすることができます。メモリからプロパティを渡す必要がありますTextBox

+0

DataGridCellには「行」プロパティはなく、TextBoxの親を探すときにも同じ問題があります。 – Fugu

関連する問題