WPFと同様- XAML バインディング式をコード ビハインドに変換するのに役立ちます
バインディングを使用して、DataGridTextColumn 内の特定の要素の色を変更しようとしています。個別のタブに任意の数の DataGrid が必要なため、分離コードで繰り返し作成しています。列を作成するための私のコードは次のとおりです。
// create a value column
column = new DataGridTextColumn();
column.Binding = new Binding("Value");
BindingOperations.SetBinding(column, DataGridTextColumn.ForegroundProperty, new Binding("TextColor"));
listGrid.Columns.Add(column);
Value バインディングは正常に機能しますが、TextColor プロパティの getter は呼び出されません。
グリッドの ItemsSource プロパティは、VariableWatcher オブジェクトのリストに設定されており、そのプロパティの一部を次に示します。
public bool Value
{
get { return _variable.Value; }
}
// used to set DataGridTextColumn.Foreground
public Brush TextColor
{
get
{
Color brushColor;
if (_valueChanged)
brushColor = Color.FromRgb(255, 0, 0);
else
brushColor = Color.FromRgb(0, 0, 0);
return new SolidColorBrush(brushColor);
}
}
VariableWatcher は、次のように INotifyPropertyChanged を実装します。
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
VariableWatcher のメソッドの 1 つに、次の行があります。
_valueChanged = true;
NotifyPropertyChanged("Value");
NotifyPropertyChanged("TextColor");
「Value」行をまたぐと、Value getter のブレークポイントがアクティブになり、Value テキストがディスプレイで更新されます。ただし、「TextColor」行をステップオーバーしても、TextColor ゲッターのブレークポイントはアクティブにならず、テキストの色は変更されません。ここで何が起こっているのか分かりますか?
編集:ダマスカスのおかげで、これが答えです。(これを彼の回答のコメントに入れましたが、コードが適切にフォーマットされませんでした。)これをXAMLファイルに追加しました:
<Window.Resources>
<Style x:Key="BoundColorStyle" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{Binding TextColor}" />
</Style>
</Window.Resources>
C# コードでは、BindingOperations 行を次のように置き換えました。
column.ElementStyle = this.FindResource("BoundColorStyle") as Style;