2013-10-23 127 views
1

我想將媒體元素的位置綁定到它的模型視圖。我知道這個屬性不是一個依賴屬性。所以嘗試過這種方式,代碼我的淨綁定屬性不是依賴項屬性

<MediaElement Source="{Binding CurrentClip.Path, Converter={StaticResource converter}, UpdateSourceTrigger=PropertyChanged}" Stretch="Uniform" local:MediaElementHelper.Postion="{Binding CurrentClip.Postion}" 

MediaElementHelper

class MediaElementHelper 
{ 
    public static readonly DependencyProperty PostionProperty = 
     DependencyProperty.RegisterAttached("Position", 
     typeof(bool), typeof(MediaElement), 
     new FrameworkPropertyMetadata(false, PostionPropertyChanged)); 

    private static void PostionPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var richEditControl = obj as MediaElement; 

     if (richEditControl != null) 
     { 
      richEditControl.Position = (TimeSpan)e.NewValue; 
     } 
    } 
    public static void SetPostion(UIElement element, TimeSpan value) 
    { 
     element.SetValue(PostionProperty, value); 
    } 
    public static TimeSpan GetPostion(UIElement element) 
    { 
     return (TimeSpan)element.GetValue(PostionProperty); 
    } 
} 

[錯誤] 甲發現「綁定」不能在類型爲「的MediaElement」的「SetPostion」屬性設置。 '綁定'只能在DependencyObject的DependencyProperty上設置。

我在做什麼錯了?

回答

2

你所面臨的問題是由於這樣的事實,你有你的AttachedProperty錯存取名稱。

代替GetPostionSetPostion他們應該GetPositionSetPosition和offcourse同樣在使用AttachedProperty應該local:MediaElementHelper.Position(不是當前位置)。

也需要更新您的Typedefault value,正如其他答案所建議的那樣。但是沒有必要從DependancyObject中派生出你的班級,而是可以讓你的班級變成static

+0

錯過了錯字... – Aron

1

我能看到的唯一錯誤是您的附加屬性沒有註冊到正確的類型。

public static readonly DependencyProperty PostionProperty = 
    DependencyProperty.RegisterAttached("Position", 
    typeof(TimeSpan), typeof(MediaElement), 
    new FrameworkPropertyMetadata(TimeSpan.FromSecond(0), ChangeHandler)); 

想我應該把一個模板附加屬性....

public class AttachedPropertyClass 
{ 
    private static readonly {PropertyType} DefaultValue = ...; 

    public static readonly DependencyProperty {PropertyName}Property 
     = DependencyProperty.RegisterAttached("{PropertyName}", 
    typeof({PropertyType}), typeof({AttachedType}), 
    new FrameworkPropertyMetadata(DefaultValue, PostionPropertyChanged));; 

    public static void Set{PropertyName}(DependencyObject d, {PropertyType} value) 
    { 
     d.SetValue({PropertyName}, value); 
    } 

    public static {PropertyType} Get{PropertyName}(DependencyObject DepObject) 
    { 
     return ({PropertyType})DepObject.GetValue({PropertyName}); 
    } 

    private static void ChangeHandler(DependencyObject obj, DependencyPropertyChangedEventArgs e); 
} 
+0

我得到一個新的錯誤默認值類型不匹配的位置 – thewayman

+0

哎呦的特性」類型....你是正確的...兩個地方了類型錯誤,返回類型(顯式)和默認(false,隱式仍然是bool)。我已經更新了我的答案。 – Aron

0
<MediaElement Source="{Binding CurrentClip.Path, Converter={StaticResource converter}, UpdateSourceTrigger=PropertyChanged}" Stretch="Uniform" local:MediaElementHelper.Position ="{Binding CurrentClip.Postion}"> 

所做的更改

public static class MediaElementHelper 
{ 
    private static readonly TimeSpan DefaultValue = new TimeSpan(0); 

    public static readonly DependencyProperty PositionProperty = 
     DependencyProperty.RegisterAttached("Position", 
     typeof(TimeSpan), typeof(MediaElementHelper), 
     new FrameworkPropertyMetadata(DefaultValue, PositionPropertyChanged)); 

    private static void PositionPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var richEditControl = obj as MediaElement; 

     if (richEditControl != null) 
     { 
      richEditControl.Position = (TimeSpan)e.NewValue; 
     } 
    } 
    public static void SetPosition(UIElement element, TimeSpan value) 
    { 
     element.SetValue(PositionProperty, value); 
    } 

    public static TimeSpan GetPosition(UIElement element) 
    { 
     return (TimeSpan)element.GetValue(PositionProperty); 
    } 
}