2012-02-24 17 views
2

リモートサーバー上の特定の属性にデータが使用できるかどうかに応じて、nullの可能性のある多数の属性を持つモデルがあります。C#のリフレクションを使用したxaml要素へのアクセスと変更

私は携帯電話でこの情報のより簡単にアクセス可能なバージョンを提供する簡単なWindows電話アプリケーションを構築しています。私は、上記のモデルのプロパティが設定されていない場合、値が表示されない(空白を表示する)が、ラベルはまだ表示されることがわかりました。

これに対して、if文の膨大な量(ughを含む)を考慮した後、xamlの特定の属性の名前を、私が探していたデータモデルのプロパティと一致させる次に、リアルタイムで、システムがデータモデルのプロパティとxamlの要素を分析するようにします。私のxamlのプロパティがモデルのプロパティの名前と一致し、モデルがnullの場合、私は可視性を折りたたむことができます。モデルがnullでない場合は、モデルを可視にします。したがって、私は実際に利用可能なデータだけを表示するきれいでダイナミックなソリューションを持つことができました。

は、ここでは、コード残念ながら

PropertyInfo[] properties = data.GetType().GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 

    FieldInfo view = this.GetType().GetField(property.Name); 

    if (view != null) 
    { 
     if (property.GetValue(data, null) == null) 
     { 
      object aView = view.GetValue(this); 
      aView.GetType().GetProperty("Visibility").SetValue(aView, "Collapsed", null); 
     } 
     else 
     { 
      object aView = view.GetValue(this); 
      aView.GetType().GetProperty("Visibility").SetValue(aView, "Visible", null); 
     } 
    } 
} 

だ、私は暗礁に乗り上げます。私はxaml要素にアクセスする方法を理解できません。私は使用しようとしました

this.GetType().GetProperties() 
this.GetType().GetFields() 
this.GetType().GetMembers() 

私が探している要素を見つけるには、それらのいずれにも表示されません。私が紛失しているものがありますか?

これを行うにはもっと美しい方法がありますか?

ご協力いただきありがとうございます。

+0

あなたはこれについて間違った方法をとっていると思います。 MVVMパターンに従い、可視性をモデル内のプロパティにバインドして、利用可能なデータがあるかどうかを判断する必要があります。 –

+0

@JeffMercado MVVMパターンに従う必要はありません!これが単純なアプリケーションの場合、コードビハインドのビットは何の害も及ぼしません。 – ColinE

+0

あなたはそれを行う方法の提案があれば、私はすべての耳です!理想的には、この要素に関連するすべての要素を含むStackPanelが表示/折りたたまれます。 –

答えて

1

各要素の可視性バインディング式で使用されるカスタムコンバータを作成できます。このコンバーターは、渡されたプロパティをチェックし、nullの場合はCollapsedを値として返します。それ以外の場合はVisibleです。

あなたがやっているのと似ていますが、すべてが宣言的で、リフレクションを使うよりはるかに高速です。

TextBlock txt = this.FindName("txt") as TextBlock; 

ませ反射:あなたがFindNameメソッドを介してそれらを見つけることができます

<Grid> 
    <TextBlock x:Name="txt" /> 
</Grid> 

http://digitalmoto.net/blog/2011/02/28/null-object-to-visibility-converter/

+0

興味深いですね、これを提案できるコードはありますか? –

+0

例を追加しました。私は、すべての要素にVisibilityバインディングを追加する必要がないように、自動化する方法を考えようとしています。あなたはいつも同じタイプの要素でこれを使用していますか?つまり、それらはすべてTextBlocksまたはLabelsですか? – devdigital

+0

StackPanelsは安全な賭けになるでしょう、通常、私は2つのtextBlocksを持っています。ラベル用に1つ、値用に1つ、水平stackPanelでラップされています。 –

3

次のようにあなたのXAMLの要素を命名している場合 - ここで

は一例です必要とされている!

+0

Founds私はまだこれを実行するために、モデルからすべてのプロパティの名前を取得するために、リフレクションが必要になると思います。それがうまくいかないとは言っていない、ちょうど私がまだ反対側のために反射を必要としていると言っている。 –

+0

@JamieStarke OK - MVVMが問題のより良いルートかもしれないように聞こえます。ちなみに、Stack Overflowを初めてお使いになる方は、参考になった回答をupvoteすることを忘れないでください。彼らは完璧なフィットではない場合、それらを答えとしてマークする必要はありませんが、アップボトンスは良いです:-) – ColinE

+0

ああ、私はupvoteする予定ですが、私は15ポイントを得るまですることはできません。 –

関連する問題