2012-02-24 26 views
2

我有一個模型具有一些可能爲或不可爲null的屬性,具體取決於數據是否可用於遠程服務器上的這些特定屬性。在C中使用反射訪問和修改xaml元素#

我正在構建一個簡單的Windows Phone應用程序,該應用程序可以在手機上爲這些信息提供更容易訪問的版本。我發現,如果上述模型的屬性未設置,則該值不會顯示(顯示空白),但標籤仍顯示出來。

在考慮了許多不同的選擇(包括大量的if語句,呃)之後,我決定如果我爲xaml中的特定屬性設置名稱以匹配我正在尋找的數據模型的屬性在那時,我實時分析了數據模型的屬性以及我的xaml的元素。如果我的xaml中的屬性與我的模型中的屬性名稱匹配,並且模型爲空,則可以將可見性變爲摺疊狀態。如果模型不爲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模式並將可見性綁定到模型中的屬性,以確定您的數據是否可用。 – 2012-02-24 08:44:16

+0

@JeffMercado您不必遵循MVVM模式!如果這是一個簡單的應用程序,一些代碼隱藏不會造成任何傷害。 – ColinE 2012-02-24 08:46:09

+0

如果您有關於如何做到這一點的建議,我全都是耳朵!理想情況下,包含與此元素相關的所有元素的StackPanel將可見/摺疊 – 2012-02-24 08:47:59

回答

1

您可以創建一個自定義轉換器,用於每個元素的可見性綁定表達式。這個轉換器可以檢查傳入的屬性,如果爲null,則返回值爲Collapsed,否則爲可見。

與您正在做的相似,但都是聲明性的,比使用反射快得多。

下面是一個例子 - http://digitalmoto.net/blog/2011/02/28/null-object-to-visibility-converter/

+0

聽起來有趣,你有任何代碼可以爲此建議嗎? – 2012-02-24 08:48:42

+0

我已經添加了一個示例。我試圖想辦法自動化它,以便您不需要爲每個元素添加Visibility綁定。你是否總是在相同類型的元素上使用它?即它們都是TextBlocks還是標籤? – devdigital 2012-02-24 08:50:51

+0

StackPanels將是一個安全的賭注,通常,我有兩個textBlocks,一個用於標籤,一個用於值,包裝在水平的stackPanel中 – 2012-02-24 08:52:19

3

如果命名在XAML元素如下:

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

無反射:

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

您可以通過FindName方法找到他們是必須的!

+0

Founds很好,除了我認爲我仍然需要反射才能從模型中獲取所有屬性的名稱來運行它。不是說這不行,只是說我還需要反思另一邊。 – 2012-02-24 08:53:41

+0

@JamieStarke好吧 - 聽起來好像MVVM可能是解決您的問題的更好途徑。順便說一句 - 因爲你是Stack Overflow的新手,請記住提出你認爲有幫助的答案。如果他們不是最合適的,你不需要將他們標記爲答案,但是upvotes是好的:-) – ColinE 2012-02-24 08:57:15

+0

哦,我打算升級,但我不能,直到我得到15分。 – 2012-02-24 08:58:04