天天看點

Win10開發:實作GridView標明項的反選

今天在開發Flickr下載下傳器的時候遇到了要反選GridView選中項的反選問題,花了好一會兒才解決,是以寫篇博文記錄一下。

我覺得我的實作方法很Low,真的是很愚蠢的辦法。不剛好我就是個愚蠢的人,隻想到了這麼個愚蠢的辦法。如果讀者有更優的辦法歡迎指教。

廢話有點多,進入正題。

先說說幾個相關的GridView的屬性或方法:

屬性:

SelectionMode:項的選擇模式,有四個可選值。預設為單選,即Single。多選為:Multiple

Win10開發:實作GridView標明項的反選

SelectedItem:擷取或設定標明項,可讀寫

SelectedItems:擷取目前標明項,隻讀。因為GridView的標明項可以為多項,是以需要使用它。

SelectedRanges:擷取標明項的範圍集合,傳回的是個IReadOnlyList<ItemIndexRange>集合。這裡的ItemIndexRange有如下三個屬性:

Win10開發:實作GridView標明項的反選

可以把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)啊~~~

繼續閱讀