我有两个列表框。每个都从SQLight查询中获取数据。用户可以通过dbl-click项目进行选择,它应该从LB1中删除它并将其放在LB2中。用户可以选择从LB2中移除它,它应该移回LB1,直到他们对选择感到满意为止。我正在使用来自LB2的已保存数据来过滤掉在LB1中找到的任何项目(根据代码)。一旦用户对所选项目满意,LB2数据将被保存回DB。用户可以随时返回UI,并根据需要添加/删除项目。
我正在使用2 x 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周了)。该解决方案需要应用于两个ListBoxes。对此的任何帮助将不胜感激。
请查看随附的代码和评论......
... 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事件(对两个列表框都适当修改)......
CertificateLookup myListBoxItem = (CertificateLookup)((ListBox)sender).SelectedItem;
CertificateSelectedList.Add(new CertificateSelected()
{
selectedDescription = myListBoxItem.Description
});
CertificateLookupList.Remove(myListBoxItem);
答案 0 :(得分:0)
您的问题是您正在向 ListBox 添加项目,而不是在列表框绑定的集合中添加和删除项目。
您应该直接在listBoxCertificateSelected.Items.Add(myListBoxItem);
和CertificateSelectedList
添加/删除,而不是:CertificateLookupList
。