前言 WPF 的 ComboBox 控制項等綁定 enum 值很繁瑣,很讓人頭疼,網上也有提供了一些方法,基本是使用 ObjectDataProvider 方式和 MarkupExtension 方式, 有沒有辦法綁定值為 enum 類型就自動載入所有枚舉值選項,下麵記錄一種方法; 實現方式 主要通過 ...
簡述
官方對List view和Grid view的描述是:
The feature-rich ListView and GridView controls work out of box. They require no customization, but they can be customized easily. Each has its own built-in UI and UX and is designed to display nearly any type of collection as is.
翻譯過來也就說,這兩個容器功能非常豐富,他們不需要定製,但自定義內容也很簡單。每一個都有自己內置的UI和UX,並且能被用以表現所有類型集合。
UI的排布是X、Y軸的佈局,那麼縱向列表和網格確實能表達幾乎所有集合這話並非不妥。
另外,列表和網格還具有“相同樣式不同數據的重覆子件”的特殊重覆性,這意味著,其往往是和數據強綁定的。
設計者只需要關註其子件樣式即可。
綁定數據和手動添加數據
ListView
和GridView
使用屬性itemsSource
來綁定數據,或者通過在標簽內添加item
來添加數據。
但是二者是相互衝突的。
列表和網格的優先順序是[itemsSource > items],這意味著當綁定數據後,手動添加在XAML的item將會被忽視。
如何綁定數據:
<ListView itemsSource="{x:Bind ViewModel.Datas} />
佈局
預設的,ListView
使用ItemsStackPanel
作為佈局容器;GridView
則預設使用ItemsWrapGrid
。
相信兩個名字並不讓人陌生。
自然,他們的佈局容器是可以自定義的。
但是自定義之前,官方有提到一點註意事項:
If you change ItemsPanel, do not disable virtualization. Both ItemsStackPanel and ItemsWrapGrid support virtualization, so these classes are safe to use. If you use any other panel, you might disable virtualization and slow the performance of the list view. For more info, see the list view articles under Performance.
翻譯過來就是,當你改變ItemsPanel(也就是佈局容器,或者子件面板)的時候,不要關閉虛擬化。無論是棧面板還是行面板,都是支持虛擬化的,都是可以安全的使用的。而當你使用其他的面板的時候,你可以關閉虛擬化來減少這些視圖的性能損耗。
再翻譯一下就是:這兩個容器是安全的!你沒有必要特地關閉虛擬化!但是你也可以在任何情況下關閉虛擬化來達到降低性能損耗的目的!
以ListView為例。
1)改變StackPanel的佈局方向為水平
<ListView Height="80">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
2)滾動條設置
可以通過修改ListView的ScrollViewer屬性來自定義滾動條的狀態。
- ScrollViewer.HorizontalScrollMode:水平滾動條啟動或關閉(Disable, Enable)
- ScrollViewer.HorizontalScrollBarVisibility:水平滾動條的可見(Auto,Disable,Hidden,Visible)
- ScrollViewer.VerticalScrollMode:垂直的
- ScrollViewer.VerticalScrollBarVisibility:垂直的
<ListView Height="60"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollMode="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Hidden">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<x:String>Strawberry</x:String>
</ListView>
在設置ListView為水平佈局的時候,可以通過限定listview的寬度來使得滾動功能可用。
交互:選中和點擊
ListView具有兩個屬性:SelectionMode、IsItemClickEnable
開發者通過修改SelectionMode屬性來改變List的選中模式。
None:無選中樣式,列表為只讀狀態。
Single:只能選中一個。Ctrl+點擊可以取消選中;選中事件觸發時,能得到一個SelectedItem,且SelectedIndex有效。如果沒有選中,則前者是Null,後者是-1。此外,如果手動設置一個不在數據中的item,那麼其會被忽視,SelectedItem仍然為null。而如果設置一個SeletedIndex超過了數據的最大索引,那麼會拋出ArgumentException異常。
Multiple:多選;Shift+點擊可以範圍多選;使用SelectedItems獲取選中項。他和SeletedIndex、SeletedItem是同步的。另外,SeletedItem和eSeletedIndex是第一個選中的項。
Extended:拓展的;基本同Multiple。
當SelectionMode不為None且IsItemClickEnable不為False,那麼“選中”和“點擊”都會觸發事件。
觸發順序是先觸發點擊事件,再觸發選中事件。
如果點擊事件需要另一個頁面的載入後才能捕捉到,那麼點擊事件不會觸發,子件不會被選中。
如何添加選中事件:
<ListView x:Name="listView1" SelectionMode="Multiple"
SelectionChanged="ListView1_SelectionChanged">
</ListView>
然後在cs中定義事件方法void ListView1_SelectionChanged(object sender, SelectionChangedEventArgs e);
如何添加點擊事件:
<ListView SelectionMode="None"
IsItemClickEnabled="True"
ItemClick="ListView1_ItemClick">
</ListView>
然後在cs中定義事件方法:
void ListView1_ItemClick(object sender, ItemClickEventArgs e)
選擇API
在代碼中,可以通過API對ListView進行操作:
var listview = new ListView();
...
// 全選
listview.SelectAll();
// 範圍選擇
listview.SelectRange(new ItemIndexRange(0, (uint)listview.Items.Count));
// 範圍取消選擇
listview.DeselectRange(new ItemIndexRange(0, (uint)listview.Items.Count));