码迷,mamicode.com
首页 > Windows程序 > 详细

Win10开发:实现GridView选定项的反选

时间:2015-08-29 23:27:25      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:win10

今天在开发Flickr下载器的时候遇到了要反选GridView选中项的反选问题,花了好一会儿才解决,所以写篇博文记录一下。

我觉得我的实现方法很Low,真的是很愚蠢的办法。不刚好我就是个愚蠢的人,只想到了这么个愚蠢的办法。如果读者有更优的办法欢迎指教。

废话有点多,进入正题。

先说说几个相关的GridView的属性或方法:

属性:

SelectionMode:项的选择模式,有四个可选值。默认为单选,即Single。多选为:Multiple

技术分享


SelectedItem:获取或设置选定项,可读写

SelectedItems:获取当前选定项,只读。因为GridView的选定项可以为多项,因此需要使用它。

SelectedRanges:获取选定项的范围集合,返回的是个IReadOnlyList<ItemIndexRange>集合。这里的ItemIndexRange有如下三个属性:

技术分享

可以把ItemIndexRange理解为是个区间,是连续的一段。

方法:

void SelectAll():将列表项全部选中。无参无返回值

void SelectRange(ItemIndexRange itemIndexRange):根据参数itemIndexRange将相应的项选中,无返回值

void DeselectRange(ItemIndexRange itemIndexRange):根据参数itemIndexRange将相应的项取消选中,无返回值


其实介绍完以上几个属性与方法,相信很多人都能想到解决方案了。

XAML:

<GridView x:Name="gridView" SelectionMode="Multiple" ItemsSource="{x:Bind items}">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="local:Item">
                    <StackPanel Orientation="Horizontal"  Margin="2,0,0,0">
                        <SymbolIcon Symbol="{x:Bind Symbol}"/>
                        <TextBlock Text="{x:Bind Label}" Margin="24,0,0,0" VerticalAlignment="Center"/>
                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>
</GridView>

items项在C#代码中给出:

private List<Item> items = new List<Item>()
        {
            new Item() { Label = "People", Symbol =  Symbol.People  },
            new Item() { Label = "Globe", Symbol = Symbol.Globe },
            new Item() { Label = "Message", Symbol = Symbol.Message },
            new Item() { Label = "Mail", Symbol = Symbol.Mail },
            new Item() { Label = "CellPhone", Symbol = Symbol.CellPhone },
        };

Item类:

 public class Item
    {
        public string Label { get; set; }
        public Symbol Symbol { get; set; }
    }

以上都不是重点,看下面几行代码:

private void Switch_Click(object sender, RoutedEventArgs e)
      {
            var selectedRanges = gridView.SelectedRanges;
            gridView.SelectAll();
            foreach (var item in selectedRanges)
            {
                gridView.DeselectRange(item);
            }
      }

怎么样,是不是觉得很简单?

然而的是...我是个好人,连代码也要玩玩我。

上面的6行代码并不能实现反选的效果,不信你试试。反正我爆了。

调试之后,发现执行了SelectAll()方法前后,selectedRanges发生了改变。(鬼知道为什么,明明已经赋值了。若有人知道还请告知,万分感谢。)

于是又想出了个解决方案,把selectedRanges做个拷贝,于是就有了下面的方法:

private void Switch_Click(object sender, RoutedEventArgs e)
        {
            var selectedRanges = gridView.SelectedRanges;
            List<ItemIndexRange> tempRanges = new List<ItemIndexRange>();
            //foreach实现拷贝 
            foreach (var item in selectedRanges)
            {
                tempRanges.Add(item);
            }

            gridView.SelectAll();

            foreach (var item in tempRanges)
            {
                gridView.DeselectRange(item);
            }
        }

这下终于实现了想要的反选效果,真是机(yu)智(chun)如(zhi)我(ji)啊~~~



版权声明:本文为博主原创文章,未经博主允许不得转载。

Win10开发:实现GridView选定项的反选

标签:win10

原文地址:http://blog.csdn.net/zmq570235977/article/details/48090929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!