【问题标题】:Binding a property with is not a dependency property绑定属性不是依赖属性
【发布时间】:2013-10-23 05:29:38
【问题描述】:

我想将媒体元素的位置绑定到它的模型视图。我知道该属性不是依赖属性。于是就这样试了一下,网上找的一个代码

<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 上设置。

我做错了什么?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

    而不是 GetPostionSetPostion,它们应该是 GetPositionSetPosition,并且在使用 AttachedProperty 时应该是 local:MediaElementHelper.Position(不是 Postion)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我收到一个新错误默认值类型与属性“位置”的类型不匹配
      • 哎呀......你是对的......两个地方类型错误,返回类型(显式)和默认类型(false,隐式仍然是 bool)。我已经更新了我的答案。
      【解决方案3】:
      <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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-22
        • 2012-11-08
        • 2012-08-01
        • 2014-08-31
        • 2012-09-28
        • 2017-12-24
        • 2023-03-26
        • 2018-05-21
        相关资源
        最近更新 更多