2012-07-31 44 views
1

在Windows 7手機(Silverlight的平臺),當創建一個列表框,該列表框的名稱instatiated並分配到相同名稱的變量:參照對象變量名的C#實例與字符串

<ListBox Name="abcFeed" ... 

並用作:

abcFeed.ItemsSource = feed.Items; 

在我的應用我有很多的飼料,並希望將它們分配到各自的列表框。我有一個字典字典中的列表框的名稱。

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

但比使用交換機分配給我想從我的字典,並在一個循環中採取ListBox的字符串名稱動態調用的情況下,列表框飼料等。

例如,而不是這樣做的:

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; 
} 

我想以某種方式拿字典鍵並調用 實例VARIABLENAME像:

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

我已經研究過反思,大會和Activator.CreateInstance()(雖然我已經提供了這個實例),但是我沒有清楚地理解這是否可能。

可以這樣做,還是我堅持與開關?

我也試過:

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

,但我得到一個錯誤:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

+0

你也許可以使用FindName對於這個..或VisualTreeHelper找到類型列表框的項目,然後找到一個地方名稱=你正在尋找(和可能緩存結果) – 2012-07-31 05:01:59

+0

HTTP名稱: //msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname.aspx – 2012-07-31 05:04:24

回答

2

不幸的是,你不能訪問使用反射在XAML中定義的字段。 Silverlight中的安全限制禁止訪問NonPublic字段(例如爲您的XAML元素生成的字段)。

使用FindName應該可以正常工作。

ListBox abcFeed = LayoutRoot.FindName("abcFeed") as ListBox; 
+0

是的FindName對我來說工作得很好。我能夠做到: ListBox listBoxObject = LayoutRoot.FindName(feedName)as ListBox; listBoxObject。ItemsSource = feed.Items; 謝謝大家! – Jon 2012-07-31 22:37:04

1

是,Reflection是你需要這樣做的。但這:

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

不起作用,因爲Type.GetProperty()方法返回一個PropertyInfo(如Type.GetMethod()回報MethodInfo等...),所以,如果你想對房地產價值的工作,你應該使用PropertyInfo.GetValue()PropertyInfo.SetValue()方法。

你的情況,這可能是工作:

var myProperty = (ItemsControl)GetType().GetProperty(feedName).GetValue(this, null); 
myProperty.ItemsSource = feed.Items; 
相關問題