2013-01-16 51 views
3

我一直在檢查表上的應用程序,而我使用的是ListBox來顯示數據。 我使用陣列基於什麼按鈕,用戶按下填充ListBox。 (我不知道這是最好的做法,但現在它工作的。)一旦用戶完成這些步驟後,他就可以用這個命令刪除的項目:如何從一個WPF列表框中刪除選中的項目?

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

,今天我已經發現了這個問題是如何CheckBox ES添加到我的ItemTemplate與下面的XAML:

<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,顯然這方法是行不通的,我只是不知道爲什麼。

回答

2

您可以將複選框綁定到ListBoxItem的

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

謝謝穆斯塔法,那不按預期方式工作。它確實是我現在擁有的更優雅的解決方案。我很猶豫要使用此解決方案,但因爲它消除填充我從實際框和內容了。另外,在將來,我曾計劃在該堆疊面板上添加按鈕。 – bolilloBorracho

0

使用的IsSelected屬性的包裝上的數據,其中包括查看特定的數據,如財產器isChecked。綁定屬性的複選框,然後你就可以發現,已檢查的所有項目......

簡單的例子:

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> 

如果你只是想刪除檢查你的項目CA ñ讓他們這樣的:

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

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

好的解決方案。我想提一下,OP需要具備的最重要的實現是UI不是Data,因此他不應該期望從UI本身獲取選擇狀態,而是從Data項獲取選擇狀態。 –

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

在你c#

+0

謝謝Rachel,這是我想要使用的解決方案,但它給了我一個錯誤。 「名稱configSetListBox在當前上下文中不存在,我是否必須在其他地方聲明? – bolilloBorracho

+0

將其更改爲lstToDo –

+0

謝謝,這是我嘗試的第一件事,但後來我得到了:類型或名稱空間名稱'ConfigSet'找不到(您是否缺少使用指令或程序集引用?)我是否需要在某處添加引用?我無法在Google上找到任何信息。 – bolilloBorracho

0

你可以只讓一個Model爲你的項目有一個Checked屬性,如果你改變了數據在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>