1

我有一个 C# 商店应用程序并使用 DataTemplate 选择器来确定要在绑定到数组的 ListView 控件中使用哪种类型的模板。因为它是模板化的,所以我不能为每个 ListView Row 分配一个动态 x:Name。

我需要能够通过索引访问列表视图行并将它们的可见性设置为开或关。我已经尝试过这样的事情,但是每次.ItemContainerGenerator .ContainerFromItem(item);返回并且我都会得到一个 Nullable 异常:null

如何访问 XAML DataTemplate 中的控件?

经过一些研究,似乎上述解决方案仅在我触摸或设置了 SelectedItem 时才有效。看这里

为什么 ItemContainerGenerator 返回 null?

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

4

1 回答 1

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

祝你好运!

于 2014-05-19T18:48:13.143 回答