如何访问XAML DataTemplate Listview中的元素而不与其交互

时间:2014-05-14 03:53:53

标签: c# xaml data-binding datatemplate visual-tree

我有一个C#Store应用程序并使用DataTemplate选择器来确定在绑定到Array的ListView控件中使用哪种类型的Template。因为它是模板化的,所以我无法为每个ListView行分配动态x:名称。

我需要能够通过Index访问listview行并将它们的可见性设置为On或Off。我尝试过这样的事情,但是.ItemContainerGenerator .ContainerFromItem(item);返回null并且我每次都得到一个Nullable异常:

How do I access a control inside a XAML DataTemplate?

在做了一些研究之后,看来上述解决方案只有在我触摸或设置了SelectedItem时才有效。见这里

Why does ItemContainerGenerator return null?

我需要能够在页面加载(初始设置)和按钮单击上调用方法,并修改某些行可见性。

1 个答案:

答案 0 :(得分:2)

这应该做你想要的:

var items = grid.ItemsSource as IEnumerable<MyModel>;
foreach (var item in items)
{
    var container = grid.ContainerFromItem(item);
    var button = Children(container)
        .Where(x => x is Button)
        .Select(x => x as Button)
        .Where(x => x.Name.Equals("MyButton"))
        .FirstOrDefault();
    if (button == null)
        continue;
    if (item.ShouldBeVisible)
        button.Visibility = Visibility.Visible;
    else
        button.Visibility = Visibility.Collapsed;
}

使用此:

public List<Control> Children(DependencyObject parent)
{
    var list = new List<Control>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is Control)
            list.Add(child as Control);
        list.AddRange(Children(child));
    }
    return list;
}

祝你好运!