繁体   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