如何从WPF中的列表框中删除选中的项目?

时间:2013-01-16 21:10:12

标签: c# wpf list itemtemplate

我一直在研究清单应用程序,我正在使用ListBox来显示数据。 我正在使用数组根据用户按下的按钮填充ListBox。 (我不知道这是不是最好的做法,但它现在有效。)一旦用户完成了这些步骤,他就可以用这个命令删除这些项目:

private void SendSelected()
{
    while (lstToDo.SelectedItems.Count > 0)
    {
        lstToDo.Items.Remove(lstToDo.SelectedItem);
    }
}

问题在于,今天我已经学会了如何使用下面的xaml将CheckBox es添加到我的ItemTemplate

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox Padding="10">                            
                <CheckBox.LayoutTransform>
                    <ScaleTransform ScaleX="1" ScaleY="1" />
                </CheckBox.LayoutTransform>
            </CheckBox>
            <TextBlock Text="{Binding}"/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

现在删除按钮仍然有效......但是我想调整它以便删除选中的项而不是选中的项。 在winforms中,我曾经这样做过:

while (lstToDo.CheckedItems.Count > 0)
{
    lstToDo.Items.Remove(lstToDo.CheckedItems[0]);
}  

但是在WPF中,显然这种方法不起作用,我只是不确定原因。

4 个答案:

答案 0 :(得分:2)

您可以将复选框绑定到ListBoxItem的IsSelected属性

<DataTemplate>
    <CheckBox Content="{Binding .}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected" />
</DataTemplate>

答案 1 :(得分:0)

在数据上使用包装器,其中包含特定于视图的数据,例如IsChecked属性。将属性绑定到CheckBox,然后您就可以找到已经检查过的所有项目......

简单示例:

public class CheckedItem<T> where T : class
{
    public T Data { get; set; }
    public bool IsChecked { get; set; }
}

因此,您需要创建一个MyItem

列表,而不是CheckedItem<MyItem>列表

不只是相应地更改绑定:

<ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Padding="10" IsChecked={Binding IsChecked}>                            
                    <CheckBox.LayoutTransform>
                        <ScaleTransform ScaleX="1" ScaleY="1" />
                    </CheckBox.LayoutTransform>
                </CheckBox>
                <TextBlock Text="{Binding Data}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>

如果您只想删除已选中的项目,您可以按照以下方式删除它们:

List<CheckedItem<MyItem>> MyItems; 
...
...

foreach (var Item in MyItems)
{
    if (!Item.IsChecked)
    {
         lstToDo.Items.Remove(Item);
    }
}

答案 2 :(得分:0)

 private void RemoveButton_Click(object sender, RoutedEventArgs e)
  {   
   foreach(CheckedItem in lstToDo.SelectedItems)
  {
    (lsttoDo.ItemsSource as List).Remove(CheckedItem);
  }
    lsttoDo.Items.Refresh();
 }

c#

答案 3 :(得分:0)

您可以为具有Checked属性的项目创建Model,这样如果您更改了UI中的数据,MyList将会更新,并且您更新了MyList中的项目在代码中,UI将反映更改。

因此,如果您从MyList删除所有已检查的项目,则会从ListBox

中移除这些项目
public partial class MainWindow : Window
{
    private ObservableCollection<MyObject> _myItems = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        InitializeComponent();
        MyItems.Add(new MyObject { Name = "Test1" });
        MyItems.Add(new MyObject { Name = "Test2" });
        MyItems.Add(new MyObject { Name = "Test3" });
        MyItems.Add(new MyObject { Name = "Test4" });
    }

    public ObservableCollection<MyObject> MyItems
    {
        get { return _myItems; }
        set { _myItems = value; }
    }

    public void RemoveItems()
    {
        // Remove any items fro MyList that "IsChecked"
    }
}

public class MyObject : INotifyPropertyChanged
{
    private string _name;
    private bool _isChecked;

    public string Name
    {
        get { return _name; }
        set { _name = value; NotifyPropertyChanged("Name"); }
    }

    public bool IsChecked
    {
        get { return _isChecked; }
        set { _isChecked = value; NotifyPropertyChanged("IsChecked"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

XAML:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="199" Width="206" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <ListBox ItemsSource="{Binding MyItems}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox Padding="10" IsChecked="{Binding IsChecked}">
                            <CheckBox.LayoutTransform>
                                <ScaleTransform ScaleX="1" ScaleY="1" />
                            </CheckBox.LayoutTransform>
                        </CheckBox>
                        <TextBlock Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>