INotifyPropertyChanged を実装する SignalViewModel というクラスがあり、クラス SignalGraph の xaml でプロパティにバインドしていますが、変更が反映されていません。バインドしようとしている CLR プロパティは BaseNotation と呼ばれます。次のように定義された列挙型です。
public enum BaseNotation
{
Hex,
SignedDecimal,
UnsignedDecimal,
SignaedBinary,
UnsignedBinary
}
クラスと関連するソース プロパティ
class SignalViewModel : INotifyPropertyChanged
{
private BaseNotation _BaseRepresentation = BaseNotation.Hex;
public BaseNotation BaseRepresentation
{
get
{
return _BaseRepresentation;
}
set
{
if (value != _BaseRepresentation)
{
_BaseRepresentation = (BaseNotation)value;
OnPropertyChanged("BaseRepresentation");
}
}
}
ターゲット プロパティは次のとおりです。
public BaseNotation BaseRepresentation
{
get
{
return (BaseNotation)GetValue(BaseRepresentationProperty);
}
set
{
SetValue(BaseRepresentationProperty, value);
}
}
public static readonly DependencyProperty BaseRepresentationProperty =
DependencyProperty.Register("BaseRepresentation",
typeof(BaseNotation), typeof(SignalGraph),
new FrameworkPropertyMetadata(BaseNotation.Hex, new PropertyChangedCallback(ReDraw)));
Binding は、treeview の itemtemplate 内のオブジェクトに対するものです。
>
<!--Defines panel used by treeview to place items in itemspresenter-->
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<!--Template Defining the layout of items in this treeview-->
<TreeView.ItemTemplate >
<HierarchicalDataTemplate ItemsSource ="{Binding Path = bits}">
<Components:SignalGraph
x:Name="signal_graph"
IsSignal="True"
BaseRepresentation="{Binding Path=BaseRepresentation, Mode=TwoWay}"
PenWidth="{Binding ElementName=graph_viewer, Path=GraphPenWidth, Mode=OneWay}"
BusTextColor="{Binding ElementName=graph_viewer, Path=BusTextPenColor, Mode=TwoWay}"
HighValuePenColor="{Binding ElementName=graph_viewer, Path=HighValuePenColor, Mode=TwoWay}"
LowValuePenColor="{Binding ElementName=graph_viewer, Path=LowValuePenColor, Mode=TwoWay}"
UnknownValuePenColor="{Binding ElementName=graph_viewer, Path=UnknownValuePenColor, Mode=TwoWay}"
Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
VerticalAlignment="Stretch"
Signal="{Binding}"
MaxTimeValue="{Binding ElementName=graph_viewer, Path = _SignalDataViewModel.MaxTimeValue}"
AxisDivisionUnit="{Binding ElementName=graph_viewer, Path = AxisDivisionUnit}"
MinimumXInDIPs="{Binding ElementName=signal_scrollviewer, Path=HorizontalOffset}"
ViewportWidth="{Binding ElementName=signal_scrollviewer, Path=ViewportWidth}"
/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<Components:SignalGraph
x:Name="bit_graph"
IsSignal="False"
Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}"
VerticalAlignment="Stretch"
BusTextColor="{Binding ElementName=graph_viewer, Path=BusTextPenColor, Mode=TwoWay}"
HighValuePenColor="{Binding ElementName=graph_viewer, Path=HighValuePenColor, Mode=TwoWay}"
LowValuePenColor="{Binding ElementName=graph_viewer, Path=LowValuePenColor, Mode=TwoWay}"
UnknownValuePenColor="{Binding ElementName=graph_viewer, Path=UnknownValuePenColor, Mode=TwoWay}"
PenWidth="{Binding ElementName=graph_viewer, Path=GraphPenWidth, Mode=OneWay}"
Bit="{Binding}"
MaxTimeValue="{Binding RelativeSource = {RelativeSource AncestorType={x:Type DaedalusGraphViewer:GraphViewer}}, Path = _SignalDataViewModel.MaxTimeValue}"
AxisDivisionUnit="{Binding ElementName=graph_viewer, Path = AxisDivisionUnit}"
MinimumXInDIPs="{Binding ElementName=signal_scrollviewer, Path=HorizontalOffset}"
ViewportWidth="{Binding ElementName=signal_scrollviewer, Path=ViewportWidth}"
/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
デバッガーで signalgraph のデータコンテキストを確認したところ、signalviewmodel に正しく設定されています。出力にバインディング エラーはありません。さらに、SignalViewModel クラスにブレーク ポイントを配置すると、OnPropertyChanged イベントが発生していることがわかります。
しかし、調べてみると対象のプロパティに変化はありません。スクロール中にシグナルグラフの内部を壊すと、データ コンテキストの (signalviewmodel の) BaseRepresentation が BaseNotation.UnsignedDecimal に変更されたことを確認できます。ただし、SignalGraph の依存関係プロパティ BaseRepresentation は新しい値に更新されていません。バインドが機能しないのはなぜですか?