2013-10-23 125 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); 
    } 
}