我正在开发一个 windows phone 8 应用程序,其中我使用列表框来显示多个详细信息。我的问题是,我想在后面的代码中访问数据模板,即我想访问完整的数据模板,并可以访问在数据模板中声明的所有子项。
只是我想更改列表框数据模板内的元素的可见性。请提出建议。
提前致谢
我正在开发一个 windows phone 8 应用程序,其中我使用列表框来显示多个详细信息。我的问题是,我想在后面的代码中访问数据模板,即我想访问完整的数据模板,并可以访问在数据模板中声明的所有子项。
只是我想更改列表框数据模板内的元素的可见性。请提出建议。
提前致谢
i found a solution over this problem
public static T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
{
try
{
var count = VisualTreeHelper.GetChildrenCount(parentElement);
if (count == 0)
return null;
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parentElement, i);
if (child != null && child is T)
{
return (T)child;
}
else
{
var result = FindFirstElementInVisualTree<T>(child);
if (result != null)
return result;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return null;
}
I used this method to find out the first element in my data template and then i changed the visibility of the element. here is an example how to use this method..
ListBoxItem item = this.lstboxMedicationList.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
CheckBox tagregCheckBox = FindFirstElementInVisualTree<CheckBox>(item);
tagregCheckBox.Visibility = Visibility.Visible;
lstboxMedicationList.UpdateLayout();
here i is the index of ListBox item.
听起来您想要一个DataTemplate
根据绑定到的对象的属性显示或隐藏某些元素。实现此目的的更好方法之一是执行以下操作:
class MyData
{
...
public string Email {get {...} set {...}}
...
}
由于用户可能有也可能没有电子邮件地址,因此您的 DataTemplate 可以使用转换器将电子邮件的字符串值转换为Visibility
可用于显示或隐藏字段的值。转换器看起来像:
public class StringNotNullToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string text = value as string;
if (!string.IsNullOrEmpty(text))
{
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
并且您将在 XAML 中添加对它的引用,例如:
<phone:PhoneApplicationPage.Resources>
<this:StringNotNullToVisibilityConverter x:Key="StringNotNullToVisibilityConverter"/>
</phone:PhoneApplicationPage.Resources>
最后你DataTemplate
会有一条看起来像这样的线:
<TextBlock Text="{Binding Email}" Visibility="{Binding Email, Converter={StaticResource StringNotNullToVisibilityConverter}}"/>
本质上说“显示电子邮件,但如果电子邮件为空,则隐藏此字段”。