绑定属性不是依赖项属性

本文关键字:属性 依赖 绑定 | 更新日期: 2023-09-27 18:36:26

我想将媒体元素的位置绑定到它的模型视图。我知道该属性不是依赖项属性。所以尝试了这种方式,我在网上找到的代码

<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"属性上设置"绑定"。"绑定"只能在依赖对象的依赖属性上设置。

我做错了什么?

绑定属性不是依赖项属性

面临的问题是由于您的AttachedProperty的访问器名称错误

而不是GetPostionSetPostion它们应该是GetPosition的,并且在使用附加属性时SetPosition和离线,它应该是local:MediaElementHelper.Position的(而不是位置)。

此外,您还需要按照其他答案的建议更新您的Typedefault value。但是没有必要从DependancyObject派生你的类,而是你可以让你的类static

我能看到的唯一错误是您的附加属性未注册为正确的类型。

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