在C#中使用反射访问和修改xaml元素



我有一个模型,它有许多属性,这些属性可能为null,也可能不为null,这取决于远程服务器上这些特定属性的数据是否可用。

我正在构建一个简单的windows手机应用程序,它可以在手机上提供更容易访问的信息版本。我发现,在上面模型的属性没有设置的情况下,值不会显示(显示为空白),但标签仍然显示。

在考虑了许多不同的替代方案(包括大量的if语句,ugh)后,我决定,如果我在xaml中设置特定属性的名称以匹配我正在查看的数据模型的属性,那么我就可以让系统实时分析数据模型的特性和xaml的元素。如果我的xaml中的一个属性与我的模型中的属性名称匹配,并且模型为null,我可以将可见性设置为折叠。如果模型不为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;

无需反思!

您可以创建一个自定义转换器,用于每个元素的Visibility绑定表达式。此转换器可以检查传入的属性,如果为null,则返回Collapsed作为值,否则返回Visible。

与您正在做的类似,但都是声明性的,而且比使用反射快得多。

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

相关内容

  • 没有找到相关文章

最新更新