首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 列表繫結完整指南:資料樣板、ObservableCollection、排序與篩選

     編輯:關於.NET

從單一物件到列表繫結的跨越

先前範例繫結單一 Person 物件,實務上更常見的是繫結到物件列表。定義 People : List<Person> 集合類別,在 XAML 中宣告包含多個 Person 的 People 資源(範例 4-19、4-20)。

當前項機制與導航

預設行為與視圖概念

列表繫結時,文字方塊等單值控制項繫結到「當前項」。預設第一個項目為當前項。為了在程式碼中存取當前項,需透過 BindingOperations.GetDefaultView 取得 ICollectionView 介面(範例 4-21、4-22)。

導航方法(範例 4-23)

view.MoveCurrentToPrevious();
view.MoveCurrentToNext();
view.MoveCurrentToFirst();
view.MoveCurrentToLast();
// 搭配 IsCurrentBeforeFirst、IsCurrentAfterLast 判斷邊界

列表控制項與資料樣板

ListBox 同步顯示(範例 4-24)

<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />

IsSynchronizedWithCurrentItem 確保 ListBox 選取項目與視圖當前項雙向同步。

DataTemplate 自訂顯示格式(範例 4-25)

<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>

資料樣板定義每個資料項的視覺樹,支援完整的繫結與轉換器。

類型化資料樣板(範例 4-26)

將 DataTemplate 移至 Resources 並設定 DataType="{x:Type local:Person}",應用程式中所有 Person 物件自動套用此樣板,無需在每個 ListBox 重複設定 ItemTemplate。

動態列表變更:INotifyCollectionChanged 與 ObservableCollection

直接使用 List<T> 新增項目時,ListBox 不會自動更新(圖 4-15)。需實作 INotifyCollectionChanged 介面通知繫結系統。WPF 提供 ObservableCollection<T> 已實作此介面(範例 4-28、4-29、4-30),替換 List<T> 即可獲得自動更新功能(圖 4-16)。

排序功能

SortDescription 簡易排序(範例 4-31)

view.Sort.Add(new SortDescription("Name", ListSortDirection.Ascending));
view.Sort.Add(new SortDescription("Age", ListSortDirection.Descending));

新增項目會自動插入正確排序位置(圖 4-17)。

自訂排序 IComparer(範例 4-32)

實作 IComparer.Compare,指派給 ListCollectionView.CustomSort。注意需轉型為 ListCollectionView,並非所有視圖實作都支援 CustomSort。

篩選功能(範例 4-33)

view.Filter = delegate(object item) {
  return ((Person)item).Age >= 18;
};

使用匿名委託實作 Predicate<object>,新增項目自動套用篩選條件(圖 4-18)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved