2016-08-11 7 views
0

私はいくつかの問題は、私の腐敗のプロパティの作業を取得しています。しかし、実際には私が別のクラスからそれらにアクセスしようとしている場合のみです。依存プロパティGetValue異なるクラス

私は、サーバーにpingを実行し、対応する依存関係プロパティを定義するには、チェックをやっているたとえば

 public static DependencyProperty PingStateProperty = 
     DependencyProperty.Register("PingState", typeof(bool), 
     typeof(MainWindow)); 

    public bool PingState 
    { 
     get { return (bool)GetValue(PingStateProperty); } 
     set 
     { 
      SetValue(PingStateProperty, value); 
      PropertyChanged(this, new PropertyChangedEventArgs("PingState")); 
     } 
    } 

今、私は別のクラスに依存関係プロパティの値を取得したいと思います(特にユーザーコントロール)。だから私は、私はこのような値を取得しようとしている別のクラスを持っている:私はここで間違って

public void MethodInClass2() 
    { 
     bool ping = (bool)GetValue(MainWindow.PingStateProperty); 

何をやっていますか?私にバグがあるのは、同じクラスのGetValueを呼び出すときに動作していることです。それは私にコンパイルエラーなどを与えません、それは一見正しい値を渡していないようです(DPが定義されているクラス1では、値を確認して、期待どおりに "真"を得ることができます。私はクラス2で同じことをやっています。

このような場合、添付プロパティが必要ですか?残念ながら、彼らと一緒に少しでも試してみましたが、役に立たなかった。

ごあいさつ

+0

を呼び出します。 – SLaks

答えて

0

あなたがプロパティの値をしたい場合は、前のコメントと回答に記載されているように、あなたは、値を保持しているインスタンスを必要としています。セッター/シングルトンなどを使用してインスタンスを取得します。依存関係/添付プロパティでは問題は解決しません。 (プロパティにバインドする場合は、依存関係プロパティを使用してください)。

+0

これは実際に本当に私を得た。つまり、私はそこにバインドする必要はありません、私はちょうどユーザーコントロールのさらなる分析のための値が必要です。私はそれをどうやってやったのか答えを投稿します。ありがとうございました。答えとしてマークされています(ただしタイトルは現在誤解を招くかもしれませんが...)。 – CuttingWide

0

以前に値を設定していない限り、値を取得できません。また、ターゲットオブジェクトが同じタイプのものである場合や、添付されたプロパティでない場合は派生オブジェクトの場合にのみ、その値を設定できます。このようにGetValueを呼び出すと、でなく、メインウィンドウからプロパティを取得すると、現在のインスタンス(ユーザーコントロール)からプロパティが取得されます。

追加コードをCLRラッパー(public bool PingState)に配置しないでください。バインディングシステムなどによって呼び出されるのではなく、プロパティに適切にアクセスするときに呼び出されます。プロパティを変更するコールバックを取得するにはmetadataproperty registrationにしてください。

+0

申し訳ありませんが、まずはお返事いただきありがとうございます。 CLRラッパーの問題について言及したのは当然ですが、私はそれを変更します。しかし、実際のことについて:私は参照してください、私は添付プロパティが必要です。しかし、私はこれで見つけることができる通常のチュートリアルは、同じスレッドからそれをやっている。どのようにdfiferent(私のUserControl)からそれを呼び出すには? – CuttingWide

+0

@CuttingWide [添付プロパティの概要](https://msdn.microsoft.com/en-us/library/ms749011(v = vs.110).aspx)を参照してください。 – Clemens

+0

@ CuttingWide:あなたのUserControlが実際に別のスレッドにある場合、間違っている可能性があります。すべてを複雑にします。あなたが別の答えを受け入れたので、私はあなたがここで別のクラスからのアクセスを意味すると仮定します。 –

-1

@aQsuのおかげで、これを別に並べ替えることができました。私は、次のようなインスタンスを取得するために、今シングルトンを使用しています:

 private static MainWindow _instance; 

    public static MainWindow Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new MainWindow(); 

      return _instance; 
     } 
    } 

その後、単にあなたが間違ったインスタンスの値を取得しているユーザーコントロール

  bool ping = MainWindow.Instance.PingState; 
+1

私は、メインウィンドウをシングルトンにしないことをお勧めします。私は通常 'App'クラスのインスタンスプロパティのようなものを定義しています。これは' Application.Current'を介して取得できます(キャストする必要があるので、通常はオーバーライドします'Current'は' App'クラスにキャストされているので、 'App.Current'は' App'インスタンスを返します。) –

+1

アプリケーションは 'ShutdownMode'に関連する' MainWindow'プロパティも持っています。インスタンスに正しく型付けされたプロパティを非表示にすることもできます。 –

関連する問題