【问题标题】:Wpf styles and attached propertiesWpf 样式和附加属性
【发布时间】:2010-09-09 19:58:55
【问题描述】:

我一直在研究行为,遇到了一个有趣的问题。 这是我的行为:

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 name:property”粉碎。

想知道我做错了什么,在基类中包含 IsEnabled 代码会很棒。

谢谢,

【问题讨论】:

    标签: wpf styles dependency-properties attached-properties


    【解决方案1】:

    在基类的 IsEnabledProperty 定义中,尝试将其更改为:

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

    也就是说,不要将 TBehavior 作为 DP OwnerType 传递,而是传递 BaseBehavior&lt;TObj, TBehavior&gt;

    【讨论】:

    • 太棒了,成功了,10 倍。昨晚我尝试这个时一定睡得很熟。