我有一个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?
我需要能够在页面加载(初始设置)和按钮单击上调用方法,并修改某些行可见性。
答案 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;
}
祝你好运!