今天在開發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)啊~~~