以下のコードがあるとしましょう...状態と表示する実際の値を保持する Field クラスがあります。Field1 という名前のこの MyField クラスのインスタンスを定義するモデルがあります。DataGrid では、この Field1 にバインドし、スタイルを使用して値を表示し、IsStale が true の場合は背景に色を付けます。問題は値でも、背景が色付けされていることでもありません。バインディングを「Field1」として指定しても、そのまま使用すると、スタイルのデータコンテキストは MyData オブジェクトであり、実際には MyField オブジェクトではないことが問題のようです。出力されるエラーは、「BindingExpression パス エラー: 'IsStale' プロパティが 'object' ''MyDataModel' に見つかりません」です。Datagrid の複雑なプロパティに適切にバインドする方法
class MyField : BaseModel
{
private bool _isStale;
public bool IsStale
{
get { return _isStale; }
set
{
if (_isStale == value) return;
_isStale = value;
NotifyPropertyChanged("IsStale");
}
}
private double _value;
public double Value
{
get { return _value; }
set
{
if (_value.Equals(value)) return;
_value = value;
NotifyPropertyChanged("Value");
}
}
}
class MyDataModel
{
MyField Field1 {get; set;}
public MyData()
{
Field1 = new Field1();
//when ever underlying property of MyField changes, we need to fire property changed because xaml binds to Field1
Field1.PropertyChanged += (o,e) =>
{
MyField field = o as MyField;
if (field!=null)
NotifyPropertyChanged("Field1");
};
}
}
<DataGridTextColumn Header="Weight" Binding="{Binding Field1}" ElementStyle="{StaticResource DGCellStyle}"/>
Style:
<Style x:Key="DGCellStyle" TargetType="TextBlock">
<Setter Property="Width" Value="Auto"/>
<Setter Property="Text" Value="{Binding Value, Converter={StaticResource NumberFormatConverter}, ConverterParameter=0.00}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsStale}" Value="True">
<Setter Property="Background" Value="Pink"/>
</DataTrigger>
</Style.Triggers>
</Style>