我有一个具有许多属性的模型,这些属性可能为空,也可能不为空,具体取决于数据是否可用于远程服务器上的那些特定属性。
我正在构建一个简单的Windows手机应用程序,可以在手机上提供更容易访问的此类信息版本。我发现,如果未设置上述模型的属性,则该值不会显示(显示空白),但标签仍会显示。
在考虑了许多不同的替代方案(包括大量的if语句,呃)之后,我决定如果我在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()
要找到我正在寻找的元素,但它们不会出现在任何元素中。有什么我想念的。
有更好的方法可以做到更漂亮吗?
提前感谢您的帮助。
答案 0 :(得分:4)
如果您在XAML中命名了元素,如下所示:
<Grid>
<TextBlock x:Name="txt" />
</Grid>
您可以通过FindName方法找到它们:
TextBlock txt = this.FindName("txt") as TextBlock;
不需要反思!
答案 1 :(得分:1)
您可以创建一个自定义转换器,用于每个元素的Visibility绑定表达式。此转换器可以检查传入的属性,如果为null,则返回Collapsed作为值,否则为Visible。
与您正在做的相似,但都是声明性的,并且比使用反射要快得多。
以下是一个示例 - http://digitalmoto.net/blog/2011/02/28/null-object-to-visibility-converter/