【问题标题】:How to get selected controls from GridView with SelectionMode=Multiple如何使用 SelectionMode=Multiple 从 GridView 获取选定的控件
【发布时间】:2016-02-14 00:22:57
【问题描述】:

我有一个像这样的 GridView:

<GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="list_SelectionChanged" ItemsSource="{x:Bind Wallpapers}" SelectionMode="Multiple">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="data:ImageItem">
            <StackPanel>
                <Image FlyoutBase.AttachedFlyout="{StaticResource ImageMenuFlyout}" Width="150" Height="90" Source="{x:Bind img}" Tag="{x:Bind TagIndex}" Holding="Image_Holding" Tapped="Image_Tapped"/>
                <Image Source="used.png" Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}"/>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

我需要在 GrifView 的 OnSelectionChanged 方法上获取第二个 Image 控件的可见性。

我需要这个,因为如果用户选择了至少一个具有“可见”的第二个图像控件可见性的项目,我必须启用一个按钮。

【问题讨论】:

    标签: c# gridview win-universal-app windows-10-mobile visual-studio-2015


    【解决方案1】:

    尝试重新创建您的示例。

    我假设你有一个名为ImageItem 的类。我创建了一个只有Used 属性:

    public class ImageItem
    {
        public Visibility Used { get; set; }
    }
    

    我的观点和你的基本一样,我用了不同的ItemsSource名字,只剩下了第二个Image控件的Visibility绑定:

    <GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="List_OnSelectionChanged" ItemsSource="{x:Bind Items}" SelectionMode="Multiple">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="local:ImageItem">
                <StackPanel>
                    <Image Width="150" Height="90" />
                    <Image Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}"  />
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
    

    我将它绑定到以下集合:

    Items = new ObservableCollection<ImageItem>
    {
        new ImageItem() { Used = Visibility.Visible },
        new ImageItem() { Used = Visibility.Visible },
        new ImageItem() { Used = Visibility.Collapsed },
    };
    

    所以只有第三个项目的第二个Image 被隐藏了。

    我的选择更改处理程序如下:

    private void List_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var gridView = sender as GridView;
    
        if (gridView != null)
        {
            var isAtLeastOneVisible =
                gridView.SelectedItems.OfType<ImageItem>().Any(i => i.Used == Visibility.Visible);
        }
    }
    

    所以isAtLeastOneVisible 将在您至少选择列表中的第一项和/或第二项时为真,如果您只选择第三项,则为假。

    【讨论】:

    • 非常感谢,您完全理解我的意思。它工作正常。在哪里可以找到该代码的指南(i => i.Used == Visibility.Visible),但我不太了解。谢谢。
    • 它被称为 lambda 表达式,它们非常有用。 MSDN链接:msdn.microsoft.com/en-us/library/bb397687.aspx另一种简单解释:codeproject.com/Tips/298963/…
    • 它像 foreach cicle 一样工作,或者这个 lambda 表达式在速度方面更好?
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2012-01-03
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多