我有一个列表框,其中有一个数据模板绑定到xml文件中的任务,我想在按钮点击时删除所选模板,但它会抛出异常"当ItemsSource正在使用时,操作无效。使用ItemsControl.ItemsSource访问和修改元素。"
这是xaml的代码
<TabItem>
<Canvas Height="700" Width="850">
<Canvas.Resources>
<XmlDataProvider x:Key="Tasks" XPath="tasks"
Source="http://store.tymesheet.com/templates/Graphic-Designer.xml"/>
<DataTemplate x:Key="tasktemplate1">
<Canvas Height="50" Width="850" >
<Label Content="{Binding XPath=name}" Height="30"
Width="170" Canvas.Top="10" Canvas.Left="150"
Background="LightGray"/>
<TextBox Height="30" Width="120" Canvas.Top="10"
Canvas.Left="370" Background="AliceBlue"/>
<Label Canvas.Left="500" Canvas.Top="10">$</Label>
<Button Tag="{Binding}" Click="deletebuttonclick"
Canvas.Top="12" Height="10" Width="30"
Canvas.Left="600"/>
</Canvas>
</DataTemplate>
</Canvas.Resources>
<ListBox ItemTemplate="{StaticResource tasktemplate1}"
ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}"
x:Name="tasklistbox" Height="700" Width="850"/>
<Label Canvas.Top="-18" Canvas.Left="185">Select Task</Label>
<Label Canvas.Top="-18" Canvas.Left="377" RenderTransformOrigin="0.58,0.462">Enter Bill Rates</Label>
<Button Canvas.Left="39" Canvas.Top="575" Width="139">Click to add the task</Button>
</Canvas>
</TabItem>
这是删除按钮背后的代码
private void deletebuttonclick(object sender,RoutedEventArgs e)
{
tasklistbox.Items.Remove(tasklistbox.SelectedItem);
}
我在哪里错了?,help.thanx。
答案 0 :(得分:2)
您显示的错误是相当自我解释的:
正在使用
ItemsSource
时,操作无效。请改为使用ItemsControl.ItemsSource
访问和修改元素。
显然,正如您应该知道的那样,您使用ItemsSource
上的ListBox
属性:
<ListBox ItemTemplate="{StaticResource tasktemplate1}"
ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}"
x:Name="tasklistbox" Height="700" Width="850" />
错误告诉您使用ItemsControl.ItemsSource
来访问和修改元素。因此,而不是不做它所说的:
private void deletebuttonclick(object sender,RoutedEventArgs e)
{
tasklistbox.Items.Remove(tasklistbox.SelectedItem);
}
尝试实际按照说法行事:
private void deletebuttonclick(object sender,RoutedEventArgs e)
{
tasklistbox.ItemsSource = null;
}
甚至更好:
private void deletebuttonclick(object sender,RoutedEventArgs e)
{
ChildNodes = null;
}
更新&gt;&gt;&gt;
所以看起来我们有另一个新用户问一件事情,当被给予那件东西要求另一件事时,没有那么多,谢谢你......羞耻......一个真正的耻辱。
首先,您需要将数据绑定到ListBox.SelectedItem
属性,以便您知道选择了哪个项目:
<ListBox ItemTemplate="{StaticResource tasktemplate1}" SelectedItem="{Binding Item}"
ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}"
x:Name="tasklistbox" Height="700" Width="850" />
此Item
属性应与ChildNodes
集合中的项目类型相同...如果它不够清晰 - 您需要在集合属性旁边添加该属性。然后,要删除处理程序中的该项,您只需执行此操作:
private void deletebuttonclick(object sender,RoutedEventArgs e)
{
ChildNodes.Remove(Item);
}
答案 1 :(得分:1)
如果你想删除该项目,那么我建议创建 ObservableCollection
的XmlNode并使用它绑定ItemsSource。我建议使用ObservableCollection,因为它实现了 INotifyCollectionChanged
,所以每当列表更新时,目标就是ListBox会自动更新。
代码隐藏
(添加 System.Collections.ObjectModel 名称空间以使用ObservableCollection<T>
)
public MainWindow()
{
InitializeComponent();
XmlDocument doc = new XmlDocument();
doc.Load("http://store.tymesheet.com/templates/Software-Developer.xml");
var taskList = doc.ChildNodes.OfType<XmlNode>()
.Where(node => node.Name == "tasks")
.SelectMany(node => node.ChildNodes.OfType<XmlNode>());
Tasks = new ObservableCollection<XmlNode>(taskList);
this.DataContext = this;
}
public ObservableCollection<XmlNode> Tasks { get; set; }
private void deletebuttonclick(object sender, RoutedEventArgs e)
{
XmlNode selectedNode = ((Button)sender).DataContext as XmlNode;
Tasks.Remove(selectedNode);
}
当然您还需要更新 XAML :
<ListBox ItemsSource="{Binding Tasks}"
ItemTemplate="{StaticResource tasktemplate1}"
x:Name="listBox" Height="700" Width="850"/>