0

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 は新しい値に更新されていません。バインドが機能しないのはなぜですか?

4

2 に答える 2

2

試す

{Binding Path=BaseRepresentation, Mode=TwoWay}

データ バインディング モードの詳細: http://msdn.microsoft.com/en-us/library/ms752347.aspx (「データ フローの方向」を参照)。

于 2013-09-10T01:10:13.187 に答える