我有一个 C# Store 应用程序,并使用 DataTemplate 选择器来确定在绑定到数组的 ListView 控件中使用哪种类型的模板。因为它是模板化的,所以我无法为每个 ListView 行分配动态 x:Name。
我需要能够通过索引访问列表视图行并将它们的可见性设置为打开或关闭。我已经尝试过类似的事情,但是.ItemContainerGenerator
.ContainerFromItem(item);
return null
我每次都会遇到可为空的异常:
如何访问 XAML DataTemplate 内的控件?
经过一些研究后,似乎上述解决方案仅在我触摸或设置了 SelectedItem 时才有效。看这里
为什么 ItemContainerGenerator 返回 null?
我需要能够在页面加载(初始设置)以及按钮单击和修改某些行可见性时调用方法。
这应该做你想要的:
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;
}
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)