增加或刪除記錄

書名:WPF專業(yè)編程指南
作者:李應(yīng)保
出版社:電子工業(yè)出版社
出版時(shí)間:2010-01
ISBN:9787121100116


數(shù)據(jù)綁定

一、對(duì)集合對(duì)象的綁定

4、增加或刪除記錄

  • 數(shù)據(jù)表的另外兩個(gè)常用操作是增加或刪除記錄。通常,我們?cè)贚istBox的下面加上“添加”和“刪除”兩個(gè)按鍵:
  <Button Name="btnAdd"  Width ="50" Margin ="2" Click="OnAdd"
      Grid.Row="1"  Grid.Column="0">添加</Button>
  <Button Name="btnDelete"  Width ="50" Margin ="2" Click="OnDelete"
      Grid.Row="1" Grid.Column="1">刪除</Button>

其在界面上的排版如圖11-10所示。我們需要在MainWindow類中增加兩個(gè)方法:OnAdd和OnDelete:

  void OnAdd(object sender, EventArgs ea)
      {
            AddressList addressList =
                  this.FindResource("addressList") as AddressList;
            addressList.Add(new AddressInfo());
            ICollectionView view =
                  CollectionViewSource.GetDefaultView(addressList);
            view.MoveCurrentToLast();
      }
      void OnDelete(object sender, EventArgs ea)
      {
            AddressList addressList =
            this.FindResource("addressList") as AddressList;
            ICollectionView view =
                CollectionViewSource.GetDefaultView(addressList);
            addressList.Remove(view.CurrentItem as AddressInfo );
            view.MoveCurrentToNext();
            if (view.IsCurrentAfterLast)
            {
                view.MoveCurrentToLast();
            }
      }
圖11-10 在數(shù)據(jù)表中增加、刪除記錄
  • 在OnAdd的方法中,程序在數(shù)據(jù)源AddressList中加入一個(gè)AddressInfo對(duì)象,然后通過修改CurrentItem來在界面上顯示新加入的記錄:
  ICollectionView view =
          CollectionViewSource.GetDefaultView(addressList);
  view.MoveCurrentToLast();

在OnDelete方法中,在數(shù)據(jù)源AddressList中刪除當(dāng)前選中的AddressInfo對(duì)象,然后把CurrentItem指向下一條地址:

  view.MoveCurrentToNext();
  if (view.IsCurrentAfterLast)
  {
      view.MoveCurrentToLast();
  }
  • 然而,在運(yùn)行這個(gè)程序時(shí),我們發(fā)現(xiàn)界面上并沒有增加或刪除一個(gè)記錄,為什么呢?
    這是因?yàn)閿?shù)據(jù)綁定的是數(shù)據(jù)源的視圖(View),而我們?cè)黾踊騽h除的是數(shù)據(jù)源。換句話說,雖然視圖是在數(shù)據(jù)源上創(chuàng)建的,一旦視圖創(chuàng)建之后,視圖和數(shù)據(jù)源之間就是獨(dú)立的。若要在數(shù)據(jù)源改變時(shí)視圖能發(fā)生相應(yīng)的變化,就需要在數(shù)據(jù)源發(fā)生改變時(shí)能夠“通知”相應(yīng)視圖的機(jī)制。
    WPF中的INotifyCollectionChanged接口就是這樣的機(jī)制。
    所以,解決的方法是為AddressList移植INotifyCollectionChanged接口。
  public class AddressList :
        List<AddressInfo>,INotifyCollectionChanged
    {
      public AddressList()
      {
      }
      public event NotifyCollectionChangedEventHandler
            CollectionChanged;
      protected virtual void
          OnCollectionChanged(NotifyCollectionChangedEventArgs e)
      {
            if (CollectionChanged != null)
            {
                CollectionChanged(this, e);
            }
      }
      public new void Add(AddressInfo o)
      {
            base.Add(o);
            OnCollectionChanged(new
                  NotifyCollectionChangedEventArgs(
                  NotifyCollectionChangedAction.Add, o));
      }
      public new void Remove(AddressInfo o)
      {
            base.Remove(o);
            OnCollectionChanged(new
                NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Remove, o));
      }
      public void Move(AddressInfo o, Int32 newIndex)
      {
          Int32 oldIndex = 0;
          OnCollectionChanged(new
                NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Move,
                o, newIndex, oldIndex));
      }
      public new AddressInfo  this[Int32 index]
      {
            get
            {
                return null;
            }
            set
            {
                AddressInfo oldValue = null;
                OnCollectionChanged(new
                    NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Replace,
                    value, oldValue));
            }
      }
    }

上面的程序是改寫的AddressList對(duì)象支持INotifyCollectionChanged接口。當(dāng)在AddressList中添加或刪除AddressInfo對(duì)象時(shí),AddressList會(huì)發(fā)出CollectionChanged,基于AddressList的視圖會(huì)自動(dòng)訂閱該事件,從而綁定到默認(rèn)視圖的列表框就會(huì)反應(yīng)數(shù)據(jù)源的變化。

  • 移植INotifyCollectionChanged接口有點(diǎn)復(fù)雜,為了簡(jiǎn)化應(yīng)用程序的工作,WPF提供了ObservableCollection類,這個(gè)類移植了INotifyCollectionChanged和INotifyPropertyChanged兩個(gè)接口。
    若我們使用ObservableCollection類,則AddressList類變得非常簡(jiǎn)單:
  public class AddressList :  ObservableCollection<AddressInfo>
    {
      public AddressList()
      {
      }
    }

即AddressList作為ObservableCollection的派生類.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 書名:WPF專業(yè)編程指南作者:李應(yīng)保出版社:電子工業(yè)出版社出版時(shí)間:2010-01ISBN:97871211001...
    大龍10閱讀 129評(píng)論 0 15
  • 常用屬性 屬性名含義RowHeaderTemplate行標(biāo)題模板RowHeaderStyle行標(biāo)題樣式Column...
    小羊愛學(xué)習(xí)閱讀 1,177評(píng)論 0 0
  • ViewPager是v4支持庫中的一個(gè)控件,相信幾乎所有接觸Android開發(fā)的人都對(duì)它不陌生。之所以還要在這里翻...
    chardlau閱讀 686評(píng)論 2 6
  • 整理一些常見的Android面試題(針對(duì)于2~3年開發(fā)經(jīng)驗(yàn)中所遇到的問題) synchronized鎖靜態(tài)方法和非...
    appzy閱讀 2,457評(píng)論 4 18
  • 一、樣式(Style)與模板(Template)二、資源字典ResourceDictionary三、數(shù)據(jù)綁定四、特...
    李?yuàn)檴檁8ef1閱讀 709評(píng)論 0 0

友情鏈接更多精彩內(nèi)容