【问题标题】:how to delete a selected template in a listbox如何删除列表框中选定的模板
【发布时间】:2014-06-17 14:09:28
【问题描述】:

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

【问题讨论】:

    标签: c# wpf listbox itemsource


    【解决方案1】:

    您显示的错误是不言自明的:

    在使用ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。

    显然,您应该知道,ListBox 上使用了ItemsSource 属性:

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

    【讨论】:

    • 如何遍历每个项目,我想删除选定的项目
    • 先生,其实我是新手,我真的不知道,希望我能进一步尝试,谢谢。
    • 我是新来的,我真的不知道...那么你自己承认,你是not qualified to use this website
    【解决方案2】:

    如果您想删除该项目,那么我建议创建 XmlNode 的 ObservableCollection 并将 ItemsSource 与它绑定。我建议使用 ObservableCollection 因为它实现了 INotifyCollectionChanged 所以每当更新列表时,在您的情况下是 ListBox 的目标都会自动更新。


    代码后面 (添加 System.Collections.ObjectModel 命名空间以使用ObservableCollection&lt;T&gt;

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

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多