0

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

4

2 回答 2

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; 
}

更新>>>

因此,似乎我们有另一个新用户问了一件事情,而当得到那个东西时,它却要求另一件事情而没有像'谢谢'...羞耻...真正的羞耻。

首先,您需要将数据绑定到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);
}
于 2014-06-17T15:41:52.683 回答
1

如果要删除该项目,那么我建议创建ObservableCollectionXmlNode 并将 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"/>
于 2014-06-17T17:06:12.250 回答