【问题标题】:WPF Can not access DependencyProperty from code [duplicate]WPF无法从代码访问DependencyProperty [重复]
【发布时间】:2019-09-20 11:29:22
【问题描述】:

我正在使用 WPF 4.5.2、.Net 4.7.2、C# 7

这是我的附加属性的基类代码

   public abstract class BaseAP<Parent, Property> where Parent : BaseAP<Parent , Property>, new()
    {

        #region Public Events


        /// <summary>
        /// Fire when the value changes
        /// </summary>
        public event Action<DependencyObject , DependencyPropertyChangedEventArgs> ValueChanged = ( sender , e ) => { };


        #endregion


        #region Properties

        /// <summary>
        /// A singleton instance of the parent class
        /// </summary>
        public static Parent Instance { get; private set; } = new Parent();


        #endregion


        #region Attached Properties Definitions

        /// <summary>
        /// The Attached Property for this class
        /// </summary>
        public static readonly DependencyProperty ValueProperty = DependencyProperty.RegisterAttached( "Value" , typeof( Property ) , typeof( BaseAP<Parent , Property> ) , new PropertyMetadata( new PropertyChangedCallback( OnValuePropertyChanged ) ) );


        /// <summary>
        /// The callback event when the <see cref="ValueProperty"/> is changed
        /// </summary>
        /// <param name="d">The UI-Element that had it's property changed</param>
        /// <param name="e">The arguments for the event</param>
        private static void OnValuePropertyChanged( DependencyObject d , DependencyPropertyChangedEventArgs e )
        {
            // --- Call the parent function
            Instance.OnValueChanged( d , e );


            // --- Call the event listeners
            Instance.ValueChanged( d , e );            
        }




        /// <summary>
        /// Gets the attached property
        /// </summary>
        /// <param name="d">The element to get the property from</param>
        /// <returns></returns>
        public static Property GetValue( DependencyObject d )
        {
            return ( (Property) d.GetValue( ValueProperty ) );
        }

        /// <summary>
        /// Sets the attached property
        /// </summary>
        /// <param name="d">The element to set the property to</param>
        /// <param name="value">The value to set to the element</param>
        public static void SetValue( DependencyObject d , Property value )
        {
            d.SetValue( ValueProperty , value );
        }

        #endregion


        #region Event Methods


        /// <summary>
        /// The method is called when any attached property of this type is changed
        /// </summary>
        /// <param name="d">The ui element that this property was changed for</param>
        /// <param name="e">The arguments for this event</param>
        public virtual void OnValueChanged( DependencyObject d , DependencyPropertyChangedEventArgs e )
        {
            SetValue( d , (Property) e.NewValue );
        }


        #endregion
    }

此代码最初由 Luke Malpass (AngelSix) 编写

我用过的财产是这样的

 public class APType : BaseAP<APType , Type> { }

在 Xaml 中:

<UserControl local:APType.Value={x:Type local:SomeType} />

SomeType 是一个普通的类,没什么特别的

在后面的代码中我正在尝试这个:

Type targetType = GetValue( APType.ValueProperty ) as Type;

不幸的是,targetType 总是 null

我做错了什么?

提前感谢

【问题讨论】:

  • 你在哪里打电话GetValue
  • 在 UserControl 后面的代码中
  • 泛型参数Property可以设置为任何类型。我正在使用它,例如用于布尔、整数甚至自定义类。在这种特殊情况下,我指的是 Type,因为我需要访问一些 local:SomeType 的元数据
  • 在构造 UserControl 之前无法设置该属性。如果您在 之后调用它,它会按预期工作,因为我在回答中声明了该属性。
  • 不要再破坏这个问题了。

标签: wpf attached-properties


【解决方案1】:

您应该在UserControl 上调用GetValueValue 附加属性已设置:

Type type = uc.GetValue(APType.ValueProperty) as Type;

XAML:

<UserControl x:Name="uc" local:APType.Value="{x:Type local:SomeType}">

在创建 UserControl 之前无法设置该属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多