2010-09-09 5 views
3

Я играл с поведением, и я столкнулся с интересной проблемой. Вот мое поведение:Wpf стили и приложенные свойства

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

стиле объявление будет раздавлено с «Значение не может быть равно null. Имя свойства: свойство».

Интересно, что я делаю неправильно, будет здорово иметь код IsEnabled в базовом классе.

Спасибо,

ответ

2

В вашем определении IsEnabledProperty в базовом классе, попробуйте изменить его на:

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

что, вместо передачи TBehavior как DP OwnerType, проходят в BaseBehavior<TObj, TBehavior> вместо.

+0

отличный, это сделал трюк, 10x. Должно быть, я спал прошлым вечером, когда я это пробовал. – Calin