从项目模板WPF获取后退列表项控件

时间:2015-01-20 04:28:46

标签: c# wpf listview templates

我将列表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}

1 个答案:

答案 0 :(得分:0)

@Amit在评论中是正确的,你应该真正使用MVVM和数据绑定方法。也就是说,如果您决定以另一种方式执行此操作,则此扩展方法应该有所帮助:

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