首页 > 解决方案 > 如何在 ListView.SelectionChanged 上获取 SelectedItem 的父项

问题描述

有人知道我如何Ellipse从以下代码中检索选定的“bgColor”吗?我可以检索Color,但我需要获取Ellipse保存它的 。

XAML

            <ListView Name="BgColorList" Height="80" Width="850"
            ItemsSource="{Binding ColorList}"
            ItemContainerStyle="{StaticResource ListViewTransparent}"
            ScrollViewer.HorizontalScrollMode="Enabled"
            ScrollViewer.HorizontalScrollBarVisibility="Hidden"
            ScrollViewer.IsHorizontalRailEnabled="True" 
            IsItemClickEnabled="True"
            VerticalAlignment="Bottom"
            SelectionChanged="BgColorList_SelectionChanged"
            Margin="0,0,0,35">
                    <ListView.DataContext>
                        <local2:NamedColors />
                    </ListView.DataContext>
                    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <ItemsWrapGrid />
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid VerticalAlignment="Center" Margin="0,0,0,0" Height="65" Width="65">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <Ellipse Name="bgColor" Grid.Column="0" Height="50" Width="50" Margin="2" VerticalAlignment="Center" Stroke="Transparent" StrokeThickness="1">
                                    <Ellipse.Fill>
                                        <SolidColorBrush Color="{Binding }" />
                                    </Ellipse.Fill>
                                </Ellipse>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>  
                </ListView>

C# - 我似乎无法在此处找到检索椭圆的方法。

    private void BgColorList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListView view = (ListView)sender;
        var selected = view.SelectedItem;
        Color selectedColor = (Color)view.SelectedItem;
    }

标签: c#xamluwp

解决方案


ListView一个ContainerFromItem方法,它应该给你一个ListViewItem容器的引用。然后,您可以获得对EllipseusingVisualTreeHelper类的引用:

private void BgColorList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListView view = (ListView)sender;
    var selected = view.SelectedItem;
    var container = view.ContainerFromItem(selected);
    if (container != null)
    {
        Ellipse ellipse = FindVisualChild<Ellipse>(container);
        if (ellipse != null)
        {
            //...
        }
    }
}

private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is T)
            return (T)child;
        else
        {
            T childOfChild = FindVisualChild<T>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

推荐阅读