如何删除列表框中的选定模板

时间:2014-06-17 14:09:29

标签: c# wpf listbox itemsource

我有一个列表框,其中有一个数据模板绑定到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。

2 个答案:

答案 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"/>