だから私は列は次のように定義されています: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
で欲しい
RelativeSourceバインディングが問題ですか? DataGridRow.Row.RowStateにアクセスできない場合や、RowStateが文字列と比較される列挙型なので、常にfalseが返される可能性があります。私が使用したい簡単なテストは、RelativeSourceにツールヒントを設定して、何かが現れるかどうかを確認することです。 – Rachel
これを試してください:http://www.codearsenal.net/2012/07/wpf-datagrid-rowdetailstemplate.html –