我遇到了一段代碼的問題,這開始使我無法理解。我在WPF基類中有聲明的DependencyProperty:SetValue打破來源的後續更新
public partial class AudioTimeControlBase : UserControl
{
public static readonly DependencyProperty PlaybackPositionProperty = DependencyProperty.RegisterAttached(
"PlaybackPosition", typeof(TimeSpan), typeof(AudioTimeControlBase),
new FrameworkPropertyMetadata(TimeSpan.Zero,
FrameworkPropertyMetadataOptions.Inherits |
FrameworkPropertyMetadataOptions.AffectsRender |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnPlaybackPositionChanged, CoercePlaybackPosition));
public TimeSpan PlaybackPosition
{
get { return (TimeSpan)this.GetValue(PlaybackPositionProperty); }
set { this.SetValue(PlaybackPositionProperty, value); }
}
private static void OnPlaybackPositionChanged(object sender, DependencyPropertyChangedEventArgs e)
{
AudioTimeControlBase control = sender as AudioTimeControlBase;
if (control != null)
control.OnPlaybackPositionChanged(e);
}
protected virtual void OnPlaybackPositionChanged(DependencyPropertyChangedEventArgs e)
{
}
private static object CoercePlaybackPosition(DependencyObject d, object value)
{
TimeSpan t = (TimeSpan)value;
if(t < TimeSpan.Zero)
return TimeSpan.Zero;
return t;
}
}
然後派生的控件:
public partial class WaveViewerControl : AudioTimeControlBase
{
public WaveViewerControl()
{
InitializeComponent();
}
void playbackControl_PositionChanged(object sender, EventArgs e)
{
PlaybackPosition = ConvertFromPosition(playbackControl.Position);
}
}
我已經取出來的東西相當多,但我真的覺得我已經分離出的觸犯了這一點。問題是,當playbackControl_PositionChanged發生(由於用戶操作)時,它會將(先前工作的)綁定打斷到PlaybackPositionProperty,並且控件不會收到後續更新。如果任何人有任何想法或線索,我會永遠感激。謝謝!
UPDATE:我意識到我留下了一些潛在的關鍵信息 - 這個控件不是直接在我的XMAL中表示,而是以編程方式添加到父控件中。但是,根據「Inhert」選項,該父項的綁定正在被正確地繼承。直到SetValue調用它們顯然被覆蓋。這是否表明雙向綁定不被繼承的屬性支持?
綁定模式未在XAML中設置,但我會檢查第二個建議,謝謝。 – Jeff 2010-09-06 21:48:06
我想我明白了,謝謝! – Jeff 2010-09-06 23:09:58