1

Windows 7 Phone(Silverlightプラットフォーム)では、ListBoxが作成されると、そのListBoxの名前が指定され、同じ名前の変数に割り当てられます。

<ListBox Name="abcFeed" ...

として使用されます:

abcFeed.ItemsSource = feed.Items;

私のアプリには多くのフィードがあり、それらをそれぞれのリストボックスに割り当てたいと思っています。文字列の辞書にリストボックスの名前があります。

this.feeds["abcFeed"] = "http://feed.abc.com/....";
this.feeds["nbcFeed"] = "http://feed.nbc.com/....";

しかし、スイッチを使用してフィードをリストボックスに割り当てる以外に、辞書からリストボックスの文字列名を取得し、ループ内でインスタンスを動的に呼び出したいと考えていました。

たとえば、次の代わりに:

feedName = "nbcFeed";
// Bind the list of SyndicationItems to our ListBox.
switch (feedName)
{
  case "abcFeed":
    abcFeed.ItemsSource = feed.Items;
    break;
  case "nbcFeed":
    nbcFeed.ItemsSource = feed.Items;
    break;
}

どういうわけか辞書のキーを取り、インスタンス化された変数名を次のように呼び出したいと思います。

feedName = "nbcFeed";
// nbcFeed.ItemsSource = feed.Items;
((ListBox) feedName).ItemsSource = feed.Items;

Reflection、Assembly、およびActivator.CreateInstance()を調べましたが(私はすでにインスタンスを持っています)、これが可能かどうかを明確に理解していません。

これを行うことはできますか、それとも私はスイッチで立ち往生していますか?

私も試しました:

this.GetType().GetProperty(feedName).ItemsSource = feed.Items;

しかし、エラーが発生します:

デリゲート型ではないため、ラムダ式を型'System.Delegate'に変換できません

4

2 に答える 2

2

残念ながら、リフレクションを使用して XAML で定義されたフィールドにアクセスすることはできません。Silverlight のセキュリティ制限により、NonPublic フィールド (XAML 要素用に生成されたフィールドなど) へのアクセスが防止されます。

FindName を使用すると正常に動作するはずです。

ListBox abcFeed = LayoutRoot.FindName("abcFeed") as ListBox;
于 2012-07-31T06:55:57.590 に答える
1

はい、Reflectionこれを行うために必要なものです。でもこれは:

this.GetType().GetProperty(feedName).ItemsSource = feed.Items;

Type.GetProperty()method が a PropertyInfo(戻り値など) をType.GetMethod()返すため機能しないため、プロパティ値を操作する場合はorメソッドMethodInfoを使用する必要があります。PropertyInfo.GetValue()PropertyInfo.SetValue()

あなたの場合、これはうまくいくかもしれません:

var myProperty = (ItemsControl)GetType().GetProperty(feedName).GetValue(this, null); 
myProperty.ItemsSource = feed.Items;
于 2012-07-31T06:20:13.377 に答える