2011-04-04 9 views
2

"Visibility"(この場合はbool)プロパティがfalseの場合、いくつかの列幅を0に設定するための顧客の動作を記述しようとしています...私の問題は、変更されたイベントが発生すると、私のAssociatedObjectは常にnullです。DependencyObject.AssociatedObjectは常にnullです

これは、関連するサンプルコードです。私が間違っている場所を誰かが見ることができます。

public static readonly DependencyProperty VisibilityProperty = 
     DependencyProperty.Register("Visibility", typeof(bool), typeof(HideRadGridViewColumnBehavior), 
     new PropertyMetadata(OnVisibilityPropertyChanged)); 

private static void OnVisibilityPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs args) 
{ 
    if (((HideRadGridViewColumnBehavior)target).AssociatedObject == null) 
    MessageBox.Show("AssociatedObject is null"); 
} 

任意の助けてくれてありがとう...

+0

移動し、右ボタンをクリックします - >使用状況を検索:

<PasswordBox> <i:Interaction.Behaviors> <behaviours:PasswordBehavior Password="{Binding Password, Mode=TwoWay}" /> </i:Interaction.Behaviors> </PasswordBox> 

行動:これは(下のコード内のコメントを参照してください)私はPasswordBox行動に実装されている方法です。プロパティがnullに設定されているか、まったく設定されていない場所が見つかります。 – vorrtex

+0

右 - これは、実際にコードに生成されていないXAMLから設定されています。あなたがアプリケーションをコンパイルするまで...私はおそらく、正しく言っているわけではありませんが、あなたはアイデアを得るでしょう。コード内の参照が設定される場所を参照しないでください。 – Kenn

+0

その後、このプロパティのセッターにブレークポイントを置くことができます。 xamlコードがこのプロパティに値を設定していないようです。 – vorrtex

答えて

3

は、どのように行動を取り付けていますか?あなたは行動のいくつかのコードを表示できますか?

AssociatedObjectは、いずれかの呼び出し後Attachやアイデアのために<i:Interaction.Behaviors></i:Interaction.Behaviors>

+0

これは、ビヘイビアがどのように設定されるかです。{ 1 – Kenn

+0

ビヘイビアにはコードがありませんが、OnVisibilityPropertyChanged内にあることが起こりますが、AssociatedObjectにアクセスできない場合は何もできません。 :( – Kenn

+3

@Kenn、OK、それはおそらく、バインディングがアタッチする前に起こることでしょう。あなたが変更したハンドラで何を持っていても、あなたはchangehandlerからコールする別個のメソッドにそれを入れて、あなたのビヘイビアで 'OnAttachedその方法をそこから呼び出すと、すべてがうまくいくはずです –

0

おかげでマルクスヒュッター以内に行動を列挙して設定されています。 AssociatedObjectプロパティに

public class PasswordBehavior : Behavior<PasswordBox> 
{ 
    public static readonly DependencyProperty PasswordProperty = 
    DependencyProperty.Register("Password", typeof(string), typeof(PasswordBehavior), new PropertyMetadata(default(string))); 

    private object _value; 

    private bool _skipUpdate; 

    public string Password 
    { 
     get { return (string)GetValue(PasswordProperty); } 
     set { SetValue(PasswordProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     // in my case on OnAttached() called after OnPropertyChanged 
     base.OnAttached(); 

     AssociatedObject.PasswordChanged += PasswordBox_PasswordChanged; 

     // using _value saved before in OnPropertyChanged 
     if (_value != null) 
     { 
      AssociatedObject.Password = _value as string; 
     } 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.PasswordChanged -= PasswordBox_PasswordChanged; 
     base.OnDetaching(); 
    } 

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     // in my case this called before OnAttached(), so that's why AssociatedObject is null on first call 
     base.OnPropertyChanged(e); 
     if (AssociatedObject == null) 
     { 
      // so, let'save the value and then reuse it when OnAttached() called 
      _value = e.NewValue as string; 
      return; 
     } 

     if (e.Property == PasswordProperty) 
     { 
      if (!_skipUpdate) 
      { 
       _skipUpdate = true; 
       AssociatedObject.Password = e.NewValue as string; 
       _skipUpdate = false; 
      } 
     } 
    } 

    private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e) 
    { 
     _skipUpdate = true; 
     Password = AssociatedObject.Password; 
     _skipUpdate = false; 
    } 
}