1

バインディングソースとなる次のクラスがあります。

public class Timeline : Canvas, INotifyPropertyChanged
{

  public static readonly DependencyProperty TimeTextBindingPropProperty;
  public event PropertyChangedEventHandler PropertyChanged;

  private void OnPropertyChanged(string name)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(name));
  }

  public double TimeTextBindingProp
  {
    get { return (double)GetValue(TimeTextBindingPropProperty); }
    set 
    {
      SetValue(TimeTextBindingPropProperty, value);
      OnPropertyChanged("TimeTextBindingProp");
    }
  }

  static Timeline()
  {
    TimeTextBindingPropProperty = DependencyProperty.Register("TimeTextBindingProp", typeof(double), typeof(Timeline));
  }
}

次に、メインウィンドウでテキストボックスのTextプロパティとプロパティの間にバインドを設定します。timeline's TimeTextBindingProp

private void InitTextBinding()
{
  timeTextBinding = new Binding();
  timeTextBinding.Mode = BindingMode.OneWay;
  timeTextBinding.Source = timeline;
  timeTextBinding.Path = new PropertyPath("TimeTextBindingProp");
  timeTextBinding.Converter = new TimeTextConverter();

  BindingOperations.SetBinding(this.timeTextBox, TextBox.TextProperty, timeTextBinding);
}

PropertyChangedバインディングが設定されてレンダリングされた後も、のハンドラーはtimelinenullのままです。timeline私は何が間違っているのですか?

編集

xamlでtimeTextBoxとタイムラインを次のように宣言します。

<StackPanel Orientation="Horizontal" Margin="0,10,0,5" HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBox Name="timeTextBox" Margin="0,0,20,0" VerticalAlignment="Center" HorizontalContentAlignment="Center" Height="20" 
                            FontFamily="Tahoma" FontSize="14" BorderBrush="White" Background="White"/>

    <Button Name="playButton" Style="{StaticResource buttonStyle}" Click="PlayButton_Click" Margin="0,0,5,0" HorizontalAlignment="Center" 
                        VerticalAlignment="Center">
                    Play
    </Button>

    <Button Name="stopButton" Style="{StaticResource buttonStyle}" Click="StopButton_Click" Margin="0,0,20,0" HorizontalAlignment="Center" 
                        VerticalAlignment="Center">
                    Stop
    </Button>

    <Slider Name="controlSlider" Height="Auto" Width="200" HorizontalAlignment="Center" VerticalAlignment="Center" IsEnabled="False">
      <Slider.ToolTip>
        <TextBlock Style="{StaticResource textStyleTextBlock}">Time Slider</TextBlock>
      </Slider.ToolTip>
    </Slider>
</StackPanel>

<ScrollViewer Name="scrollViewer" Margin="0,0,10,20" Height="500" HorizontalAlignment="Stretch" VerticalAlignment="Center" Focusable="False"
                      HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <StackPanel>
    <UI:FittingCanvas x:Name="containerCanvas">
      <timelinePanel:Timeline x:Name="timeline" TimeCursorEnabled="True" TimeMode="Minutes"  Canvas.Left="0" Canvas.Top="0" Canvas.ZIndex="0" Visibility="Hidden"
                                                CursorAnimBoundaryChanged="Timeline_CursorAnimBoundaryChanged" AnimationCompleted="Timeline_AnimationCompleted"/>
    </UI:FittingCanvas>

    <Canvas x:Name="waveFormCanvas" Height="80" Margin="0,10,0,0"/>
  </StackPanel>
</ScrollViewer>
4

1 に答える 1

2

timeTextBox.Textコードは、設定以外の方法で更新されますtimeTextBindingか?たぶん、timeTextBox.Textをコードビハインドで直接何らかの値に設定したり、他のバインディングをそれに接続したりしますか?

timeTextBindingはOneWayのみであるため、このような変更をに書き戻すことはできずTimeTextBindingProp、バインディングは(警告なしに)単に上書きおよび削除され、timeline.PropertyChangedにリセットされnullます。

于 2013-01-10T23:59:51.710 に答える