先前範例繫結單一 Person 物件,實務上更常見的是繫結到物件列表。定義 People : List<Person> 集合類別,在 XAML 中宣告包含多個 Person 的 People 資源(範例 4-19、4-20)。
列表繫結時,文字方塊等單值控制項繫結到「當前項」。預設第一個項目為當前項。為了在程式碼中存取當前項,需透過 BindingOperations.GetDefaultView 取得 ICollectionView 介面(範例 4-21、4-22)。
view.MoveCurrentToPrevious();
view.MoveCurrentToNext();
view.MoveCurrentToFirst();
view.MoveCurrentToLast();
// 搭配 IsCurrentBeforeFirst、IsCurrentAfterLast 判斷邊界
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
IsSynchronizedWithCurrentItem 確保 ListBox 選取項目與視圖當前項雙向同步。
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text=" (age: " />
<TextBlock Text="{Binding Age}" Foreground="{Binding Age, Converter={StaticResource AgeToForegroundConverter}}" />
<TextBlock Text=")" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
資料樣板定義每個資料項的視覺樹,支援完整的繫結與轉換器。
將 DataTemplate 移至 Resources 並設定 DataType="{x:Type local:Person}",應用程式中所有 Person 物件自動套用此樣板,無需在每個 ListBox 重複設定 ItemTemplate。
直接使用 List<T> 新增項目時,ListBox 不會自動更新(圖 4-15)。需實作 INotifyCollectionChanged 介面通知繫結系統。WPF 提供 ObservableCollection<T> 已實作此介面(範例 4-28、4-29、4-30),替換 List<T> 即可獲得自動更新功能(圖 4-16)。
view.Sort.Add(new SortDescription("Name", ListSortDirection.Ascending));
view.Sort.Add(new SortDescription("Age", ListSortDirection.Descending));
新增項目會自動插入正確排序位置(圖 4-17)。
實作 IComparer.Compare,指派給 ListCollectionView.CustomSort。注意需轉型為 ListCollectionView,並非所有視圖實作都支援 CustomSort。
view.Filter = delegate(object item) {
return ((Person)item).Age >= 18;
};
使用匿名委託實作 Predicate<object>,新增項目自動套用篩選條件(圖 4-18)。
