xaml在ListView中获取选定的视图

Bor*_*sky 0 c# wpf xaml listview windows-store-apps

我想在listview中获取所选项目.但我想得到没有绑定的项目,我想获得视图,即被选中.所以在我的情况下:

 <ListView.ItemTemplate>
            <DataTemplate>
                <local:MyCustomUserControl BindedItem="{Binding}"/> 
            </DataTemplate>
        </ListView.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

我想获取现在选中的MyCustomUserControl对象.谢谢,对不起,如果之前有类似问题.

Roh*_*ats 5

您可以获取基础容器,即ListViewItem使用ItemContainerGenerator和从中获取您可以通过遍历获得控制权VisualTree.

首先x:Name你的ListView,以便你可以使用该名称从后面的代码访问它:

<ListView x:Name="listView">
   ...
</ListView>
Run Code Online (Sandbox Code Playgroud)

其次,从ItemContainerGeneratorVisualTree 获取容器并遍历VisualTree以获取您的子UserControl:

var listViewItem = listView.ItemContainerGenerator
                    .ContainerFromItem(listView.SelectedItem);
var customControl = FindChildControl<MyCustomUserControl>(listViewItem);
Run Code Online (Sandbox Code Playgroud)

其中FindChildControl是遍历Visual Tree的辅助方法:

    private T FindChildControl<T>(DependencyObject control)
                                   where T : DependencyObject
    {
        T foundChild = null;
        int childNumber = VisualTreeHelper.GetChildrenCount(control);
        for (int i = 0; i < childNumber; i++)
        {
            var child = VisualTreeHelper.GetChild(control, i);
            if (child != null && child is T)
                foundChild = (T)child;
            else
                foundChild = FindChildControl<T>(child);
        }
        return foundChild;
    }
Run Code Online (Sandbox Code Playgroud)

注意:如果在Windows 8.1中使用Windows应用商店应用,如果您尚未设置,则ItemContainerGenerator将返回nullItemsPanel.而是直接在控件上使用相同的方法.在下面的例子中,listView.ItemContainerGenerator.ContainerFromItem将改为listView.ContainerFromItem.