代码之家  ›  专栏  ›  技术社区  ›  Calin

Wpf样式和附加属性

  •  3
  • Calin  · 技术社区  · 16 年前

    我一直在玩行为,我遇到了一个有趣的问题。

    public class AddNewBehavior : BaseBehavior<RadGridView, AddNewBehavior>
    {
        public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(AddNewBehavior), new FrameworkPropertyMetadata(false, OnIsEnabledChanged));
    
        public static void SetIsEnabled(DependencyObject obj, bool isEnabled)
        {
            obj.SetValue(IsEnabledProperty, isEnabled);
        }
    
        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsEnabledProperty);
        } ... OnIsEnabledChanged(...)}
    

    当我这样设置样式时,这将非常有效:

    <Style TargetType="telerikGridView:RadGridView">
        <Setter Property="Behaviors:AddNewBehavior.IsEnabled" Value="true" />
    </Style>
    

    public abstract class BaseBehavior<TObj, TBehavior> : Behavior<TObj> 
        where TObj : DependencyObject
        where TBehavior : BaseBehavior<TObj, TBehavior>, new()
    {
        public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(TBehavior), new FrameworkPropertyMetadata(false, OnIsEnabledChanged));
    
        public static void SetIsEnabled(DependencyObject obj, bool isEnabled)
        {
            obj.SetValue(IsEnabledProperty, isEnabled);
        }
    
        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsEnabledProperty);
        }
    
        public static void OnIsEnabledChanged(DependencyObject dpo, DependencyPropertyChangedEventArgs e)
        {
            BehaviorCollection behaviorCollection = Interaction.GetBehaviors(dpo);
    
            if ((bool)e.NewValue)
            {
                var firstOrDefault = behaviorCollection.Where(b => b.GetType() == typeof(TBehavior)).FirstOrDefault();
    
                if (firstOrDefault == null)
                {
                    behaviorCollection.Add(new TBehavior());
                }
            }
        }
    }
    

    样式声明将显示“Value cannot be null”。属性名称:Property”。

    谢谢,

    1 回复  |  直到 15 年前
        1
  •  2
  •   Nebril    13 年前

    public static readonly DependencyProperty IsEnabledProperty = 
      DependencyProperty.RegisterAttached(
        "IsEnabled", 
        typeof(bool), 
        typeof(BaseBehavior<TObj, TBehavior>), 
        new FrameworkPropertyMetadata(false, OnIsEnabledChanged)
      );
    

    也就是说,不是通过 TBehavior BaseBehavior<TObj, TBehavior> 相反。