2013-01-01 51 views
0

我有兩個列表框。每個從SQLight查詢中獲取數據。用戶可以通過dbl-click項目進行選擇,並將其從LB1中移除並放入LB2中。用戶可以選擇從LB2中刪除,它應該回到LB1,直到他們對選擇感到滿意。我使用LB2保存的數據過濾掉LB1中找到的任何項目(按照代碼)。一旦用戶對選定的項目感到滿意,LB2數據將保存回數據庫。用戶可以隨時選擇回到用戶界面,並根據需要添加/刪除項目。WPF將項目從一個列表框移動到另一個列表框並返回並獲取操作在ItemsSource正在使用時無效

我使用2個ObservableCollections來填充LB1和LB2。我正在使用模板來控制兩個LB的佈局。 I.E一旦項目列出10個項目,它就會「溢出」到LB內的新列中。

我能得到LB1正確填充,甚至將項目移到LB2,但是當我想再次將其移回我得到...

"Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead." 

我在WPF C#新手,需要明確有關如何解決此問題的說明。 (現在正在努力解決這個問題已經4周了)。該解決方案需要應用於兩個ListBox。任何幫助,這將不勝感激。

請仔細閱讀附帶的代碼和註釋...

CS ...

  using System; 
      using System.Windows; 
      using System.Windows.Input; 
      using System.Windows.Controls; 
      using System.Data; 
      using System.Data.SQLite; 
      using System.Collections; 
      using System.Collections.ObjectModel; 
      using System.Collections.Generic; 
      using PTWS.Class_Lib; 

      using System.ComponentModel; 
      using System.Windows.Data; 
      using System.Windows.Media; 


      namespace PTWS.MainPanelControls.FormControls.Permits 
      { 
       /// <summary> 
       /// Interaction logic for ColdWorkDraftUControl.xaml 
       /// </summary> 
       public partial class ColdWorkDraftUControl : UserControl 
       { 
        PTWDatabase db = new PTWDatabase(); 

        ObservableCollection<CertificateLookup> CertificateLookupList = new ObservableCollection<CertificateLookup>(); 
        ObservableCollection<CertificateSelected> CertificateSelectedList = new ObservableCollection<CertificateSelected>(); 

        public ColdWorkDraftUControl() 
        { 
         InitializeComponent(); 

         LoadDataCertificateLookup(); 
         // all works great untill I uncomment the next line 
         //LoadDataCertificateSelected();    
        } 

        private void LoadDataCertificateLookup() 
        { 
         try 
         { 
          DataTable conditions; 
          String query = "select lc.Section \"Section\"" 
           + ", lc.Description \"Description\"" 
           + ", lc.SortOrder \"SortOrder\" " 
           + "from LookupConditions lc " 
           + "where not exists (select 1 from SelectedConditions sc where sc.Code = lc.Code and sc.PermitID = 'CWP-12-00001') " 
           + "and lc.Section = 'Certificates'"; 

          conditions = db.GetDataTable(query); 

          foreach (DataRow r in conditions.Rows) 
          { 
           CertificateLookupList.Add(new CertificateLookup() 
           { 
            Section = r["Section"].ToString(), 
            Description = r["Description"].ToString(), 
            SortOrder = r["SortOrder"].ToString() 
           }); 
          } 

          listBoxCertificateLookup.ItemsSource = CertificateLookupList; 
         } 
         catch (Exception fail) 
         { 
          String error = "The following error has occurred:\n\n"; 
          error += fail.Message.ToString() + "\n\n"; 
          MessageBox.Show(error); 
         } 
        } 

        void LoadDataCertificateSelected() 
        { 
         try 
         { 
          DataTable conditions; 
          String query = "select Section \"Section\"" 
           + ", Description \"Description\"" 
           + ", SortOrder \"SortOrder\""; 
          query += "from SelectedConditions where PermitID = 'CWP-12-00001' and Section = 'Certificates'"; 
          conditions = db.GetDataTable(query); 



          foreach (DataRow r in conditions.Rows) 
          { 
           CertificateSelectedList.Add(new CertificateSelected() 
           { 
            selectedSection = r["Section"].ToString(), 
            selectedDescription = r["Description"].ToString(), 
            selectedSortOrder = r["SortOrder"].ToString() 
           }); 
          } 
          listBoxCertificateSelected.DataContext = CertificateSelectedList; 
         } 
         catch (Exception fail) 
         { 
          String error = "The following error has occurred:\n\n"; 
          error += fail.Message.ToString() + "\n\n"; 
          MessageBox.Show(error); 
         } 
        } 

        private void listBoxCertificateLookup_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
        { 
         try 
         { 
          ListBoxItem myListBoxItem = 
           (ListBoxItem)(listBoxCertificateLookup.ItemContainerGenerator.ContainerFromItem(listBoxCertificateLookup.Items.CurrentItem)); 
          // listBoxCertificateSelected.DataContext = null; 
          listBoxCertificateSelected.Items.Add(myListBoxItem); 
         } 
         catch (Exception fail) 
         { 
          String error = "The following error has occurred:\n\n"; 
          error += fail.Message.ToString() + "\n\n"; 
          MessageBox.Show(error); 
         } 
        } 

        private void listBoxCertificateSelected_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
        { 
         try 
         { 
          ListBoxItem myListBoxItem = 
           (ListBoxItem)(listBoxCertificateSelected.ItemContainerGenerator.ContainerFromItem(listBoxCertificateSelected.Items.CurrentItem)); 

          //listBoxCertificateLookup.DataContext = null; 
          listBoxCertificateLookup.Items.Add(myListBoxItem); 
         } 
         catch (Exception fail) 
         { 
          String error = "The following error has occurred:\n\n"; 
          error += fail.Message.ToString() + "\n\n"; 
          MessageBox.Show(error); 
         } 
        } 
       } 
      } 

XAML ...

  <UserControl x:Class="PTWS.MainPanelControls.FormControls.Permits.ColdWorkDraftUControl" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"> 

       <Grid> 
        <ListBox Name="listBoxCertificateLookup" 
          ItemsSource="{Binding CertificateSelectedList}" 
          MouseDoubleClick="listBoxCertificateLookup_MouseDoubleClick" 
          IsSynchronizedWithCurrentItem="True" 
          HorizontalAlignment="Left" Width="300" Height="75" VerticalAlignment="Top" > 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Height="23" Orientation="Horizontal"> 
            <TextBlock Text="{Binding Path=Description}" VerticalAlignment="Top" /> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
         <ListBox.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel IsItemsHost="True" Orientation="Vertical" /> 
          </ItemsPanelTemplate> 
         </ListBox.ItemsPanel> 
        </ListBox> 

        <ListBox Name="listBoxCertificateSelected" 
          ItemsSource="{Binding}" 
          MouseDoubleClick="listBoxCertificateSelected_MouseDoubleClick" 
          HorizontalAlignment="Left" Width="300" Height="75" VerticalAlignment="Top" Margin="0,153,0,0"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Height="23" Orientation="Horizontal"> 
            <TextBlock Name="textBlock" Text="{Binding Path=selectedDescription}" VerticalAlignment="Top" /> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
         <ListBox.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel IsItemsHost="True" Orientation="Vertical" /> 
          </ItemsPanelTemplate> 
         </ListBox.ItemsPanel> 
        </ListBox> 
       </Grid> 
      </UserControl> 

CLASS ...

  using System; 
      using System.Collections.Generic; 
      using System.Linq; 
      using System.Text; 

      namespace PTWS.Class_Lib 
      { 
       class CertificateLookup 
       { 
        public string Section { get; set; } 
        public string Description {get; set;} 
        public string SortOrder { get; set; } 

        public string selectedSection { get; set; } 
        public string selectedDescription { get; set; } 
        public string selectedSortOrder { get; set; } 
       } 
      } 

AMENDED CS文件mouseDoubleClick事件(a誰料適當兩個列表框)...

  CertificateLookup myListBoxItem = (CertificateLookup)((ListBox)sender).SelectedItem; 

          CertificateSelectedList.Add(new CertificateSelected() 
          { 
           selectedDescription = myListBoxItem.Description 
          }); 

          CertificateLookupList.Remove(myListBoxItem); 

回答

0

你的問題是,您要添加項目,而不是添加和刪除項目的列表框綁定到集合列表框

而不是做:listBoxCertificateSelected.Items.Add(myListBoxItem);,你應該直接添加/從CertificateSelectedListCertificateLookupList刪除。

+1

非常感謝Blachshma,您將我放在更新ObservableCollection而不是.Items.Add的正確道路上。代碼修改如有修改 –

相關問題