绑定一个属性并不是依赖属性

5

我希望将媒体元素的位置与其模型视图绑定。我知道该属性不是依赖属性。因此,我试过了下面这种方式,这是我在网上找到的代码:

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

媒体元素助手

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'属性上设置'Biding'。'Biding'只能在DependencyObject的DependencyProperty上设置。

我做错了什么?

3个回答

5
你面临的问题是由于你使用了错误的访问器名称AttachedProperty
应该使用GetPositionSetPosition而不是GetPostionSetPostion,同时在使用AttachedProperty时应该使用local:MediaElementHelper.Position(而不是Postion)。
此外,你需要根据其他答案的建议更新Typedefault value。但是,没有必要从DependancyObject派生你的类,相反,你可以将你的类设置为static

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

我收到一个新的错误:默认值类型与属性“Position”的类型不匹配。 - Taufiq Abdur Rahman
哎呀……你是对的……你犯了两个类型错误,一个是返回类型(显式),另一个是默认值(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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接