簡體   English   中英

在C#中使用反射訪問和修改xaml元素

[英]Accessing and Modifying xaml elements with Reflection in C#

我有一個模型,該模型具有許多可能為null或不為null的屬性,具體取決於數據是否可用於遠程服務器上的那些特定屬性。

我正在構建一個簡單的Windows Phone應用程序,該應用程序可在手機上提供此信息的更易於訪問的版本。 我發現在未設置上述模型的屬性的情況下,該值未顯示(顯示為空白),但標簽仍顯示。

在考慮了許多不同的選擇(包括大量的if語句,ugh)之后,我決定,如果我在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()

查找我要尋找的元素,但這些元素均未顯示。 有什么我想念的嗎?

有沒有更好的方法可以做到這一點呢?

在此先感謝您的幫助。

如果您在XAML中具有如下命名元素:

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

您可以通過FindName方法找到它們:

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

不需要反射!

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

與您正在執行的操作類似,但是都是聲明性的,並且比使用反射要快得多。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM