我将列表View与用户控件绑定如下,
<ListView Grid.Row="2" Name="lvItems">
<ListView.ItemTemplate>
<DataTemplate>
<my1:ucItem Name="li"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
该用户控件具有用户将在运行时输入的本地存储值。我不希望双向绑定,因为在运行时,用户控件添加了除用户控件之外的其他值。我设置了一些get方法来获取存储在用户控件中的值。我怎样才能找回用户控件,lvItems.Items只是返回对象列表我绑定到它,而不是我的用户控件。有没有办法找回生成的用户控制列表。
例如,我想读回那样的ListView项目,
foreach(UserControl uc in lvItems.Items){//Do Something}
答案 0 :(得分:0)
public static class ItemsControlExtensions
{
public static IEnumerable<TElement> GetElementsOfType<TElement>(
this ItemsControl itemsControl, string named)
where TElement : FrameworkElement
{
ItemContainerGenerator generator = itemsControl.ItemContainerGenerator;
return
from object item in itemsControl.Items
let container = generator.ContainerFromItem(item)
let element = GetDescendantByName(container as FrameworkElement, named)
where element != null
select (TElement) element;
}
static FrameworkElement GetDescendantByName(FrameworkElement element,
string elementName)
{
if (element == null)
{
return null;
}
if (element.Name == elementName)
{
return element;
}
element.ApplyTemplate();
FrameworkElement match = null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
match = GetDescendantByName(child, elementName);
if (match != null)
{
break;
}
}
return match;
}
}
用法如下:
foreach (UserControl uc in lvItems.GetElementsOfType<UserControl>(named: "li"))
{
// do something with 'uc'
}
GetDescendantByName
方法基于WPF博士的博文:ItemsControl: 'G' is for Generator。事实上,关于ItemsControl
如何运作的整个系列博客文章值得一读:Dr WPF: ItemsControl: A to Z。