0

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

只是我想更改列表框数据模板内的元素的可见性。请提出建议。

提前致谢

4

2 回答 2

1

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. 
于 2013-08-23T06:18:05.563 回答
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}}"/>

本质上说“显示电子邮件,但如果电子邮件为空,则隐藏此字段”。

于 2013-06-18T23:45:46.830 回答