访问列表框的完整数据窗口

时间:2013-06-18 14:49:06

标签: windows-phone-7 silverlight-4.0 windows-phone-8

我正在开发一个Windows Phone 8应用程序,其中,我使用列表框来显示多个详细信息。我的问题是,我想在后面的代码中访问datatemplate,即我想访问完整的datatemplate,可以访问在datatemplate中声明的所有子代。

我只想更改列表框的datatemplate内元素的可见性。请提出建议。

提前致谢

2 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的方法

 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;
    }

我使用此方法找出数据模板中的第一个元素,然后我更改了元素的可见性。 这是一个如何使用此方法的示例..

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. 

答案 1 :(得分:0)

听起来你想要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}}"/>

本质上说&#34;显示电子邮件,但如果电子邮件为空,则隐藏此字段&#34;。