2012-03-13 25 views
0

を失敗:オブジェクトのコンストラクタでプロパティを使用しますが、私はこのように定義されたクラス持っ

class TouchScreenDisabledGrid:DataGrid,INotifyPropertyChanged 

を私が使用している場合、XAMLを投げ設定されていることの性質上depanding私のクラスの振る舞いのsoomeを変更したいですそれは窓の中にある。例えば

public TouchScreenDisabledGrid(){ 
      Console.WriteLine(this.Tag.ToString()); 
    } 

なぜそれがあるとどのように私はproperyと使用を確認することができます。私のコンストラクタでは、私はこの値をチェックしよう

<my:TouchScreenDisabledGrid x:Name="dataGridView" Tag="13" /> 

は、例外が発生しますそれ?

+0

例外の種類は何ですか?メッセージは何を言いますか? – Abbas

答えて

2

XAMLで定義されたオブジェクトは、デフォルトコンストラクタおよびを使用して構築され、次にのプロパティが設定されます。

<my:TouchScreenDisabledGrid x:Name="dataGridView" Tag="13" /> 

本の道徳的等価です:

var g = new TouchScreenDisabledGrid(); 
g.Name = "dataGridView"; 
g.Tag = "13"; 

Tagあなたのコンストラクタの内部nullである理由が今明らかにする必要があり、あなたがToString()を呼び出すときに、したがって、あなたがNullReferenceExceptionを取得している。だから、これはと想像

はさらに続けて、あなたが設定されているオブジェクトのプロパティに依存して、コンストラクタ内で何かをするの古典的モデルを使用することはできません。目標を達成する別の方法を見つける必要があります。どのような目的があるかによって異なります(たとえば、INotifyPropertyChangedを使用してプロパティが設定されたことを検出するか、後でトリガーするイベントを聴くことができます)。ビジュアルのライフタイムを取得し、そこから値を取得します)。

+0

私はあなたの説明を理解しています。 「タグ」の説明については、オブジェクトに関する情報を渡すために使用されます。私はそれを保存し、後でプログラムのいくつかのパスを決定するためにチェックしたい。私はそれを使用するたびにチェックするほうが賢明でしょうか?より効果的な方法がありますか? – Programer

+0

@meyou:それを使用するたびにチェックする方が正しいでしょう(実際に他のプロパティと同じように)。 – Jon

+0

ええ、しかし、私はtryキャッチ物が必要なたびに、それが満たされていない場合、私はデフォルトを使用します。それは多くの機能で複製を作りました。毎回それを返す関数を悪用しないでください – Programer

2

プロパティはXAMLで設定されている場合は、コンストラクタで設定されることはありません。これを行うには、OnLoadedオーバーライドを使用します。

+0

私はオーバーライドできるこのプロパティ(OnLoaded)を持っていません。どのように私はそれに得ることができますか? – Programer

関連する問題