2010-09-06 71 views
0

我遇到了一段代碼的問題,這開始使我無法理解。我在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調用它們顯然被覆蓋。這是否表明雙向綁定不被繼承的屬性支持?

回答

0

如果在設置爲不是雙向或單向源的綁定表達式的屬性上調用SetValue,則它將用新值替換綁定表達式。您將PlaybackPositionProperty設置爲默認綁定雙向,但綁定仍可手動設置爲Mode=OneWay

檢查正在使用WaveViewerControl的XAML,並查看PlaybackPosition上的綁定是否具有Mode=OneWay。您也可以在運行時通過在您的事件處理程序中調用BindingOperations.GetBinding(this, PlaybackPositionProperty).Mode來檢查綁定。


根據您的更新,是的,這是正確的行爲。您不能更新由屬性值繼承設置的雙向綁定表達式。您正在設置一個本地值,它將覆蓋繼承的值。見Dependency Property Value Precedence

+0

綁定模式未在XAML中設置,但我會檢查第二個建議,謝謝。 – Jeff 2010-09-06 21:48:06

+0

我想我明白了,謝謝! – Jeff 2010-09-06 23:09:58

1

根據WPF Unleashed的說法,直接設置一個值將刪除綁定。 (第261頁),所以你所描述的是設計

+0

謝謝,但我不知道我跟着...爲什麼傳遞一個結構在這裏打破綁定或回調? – Jeff 2010-09-06 21:41:59

+0

對不起,忽略我以前的評論。 – Aliostad 2010-09-06 22:05:19