[英]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.