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);
}

PropertyChangedtimeline即使在绑定设置并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 回答