2011-10-26 21 views
1

私はユーザーにアイテムのコレクションを表示しています。WPFリストボックスの項目を削除する

特定のアイテムをダブルクリックした後、このアイテムをリストから削除します。

私はこのようにデータソースを変更するだけでなく、リスト内の項目を変更するのが好きではないと思います。また、私は1000レコードがある場合、リフレッシュがかなり遅くなることを認識します。

リストボックスから項目を削除するより良い方法はありますか?
データソースを変更したくないのは、私も履歴用に使用する予定だからです。

ダミーデータを設定:アイテムの

private void SetUpData() 
    { 
     this.users = new List<UserNames>(); 
     this.users.Add(new UserNames() {Id = 1, UserName = "name 1"}); 
     this.users.Add(new UserNames() { Id = 2, UserName = "name 2" }); 
     this.users.Add(new UserNames() { Id = 3, UserName = "name 3" }); 
     this.users.Add(new UserNames() { Id = 4, UserName = "name 4" }); 
     this.users.Add(new UserNames() { Id = 5, UserName = "name 5" }); 
     this.users.Add(new UserNames() { Id = 6, UserName = "name 6" }); 
     this.users.Add(new UserNames() { Id = 7, UserName = "name 7" }); 
     this.users.Add(new UserNames() { Id = 8, UserName = "name 8" }); 
     this.users.Add(new UserNames() { Id = 9, UserName = "name 9" }); 
     this.users.Add(new UserNames() { Id = 10, UserName = "name 10" }); 
     this.listBox1.DataContext = users; 
    } 

私の方法は、リストから削除されています。

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UserNames itemToRemove = (UserNames)((ListBox)sender).SelectedItem; 
     MessageBox.Show(itemToRemove.UserName); 
     this.listBox1.DataContext = null; 

     this.users.Remove(itemToRemove); // remove from list 
     this.listBox1.DataContext = this.users; // update data source 
    } 

マイリストボックスの定義:

<ListBox Grid.Column="1" Grid.Row="1" Name="listBox1" ItemsSource="{Binding}" SelectedValuePath="Id" MouseDoubleClick="listBox1_MouseDoubleClick"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Label Content="{Binding UserName}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

答えて

0

次のようにコレクションを変更したが表示された項目を削除しないようにどのような方法がある:

IEditableCollectionView items = tabControl.Items; //Cast to interface 
if (items.CanRemove) 
{ 
    items.Remove(tabControl.SelectedItem); 
} 

はあなたの助けをありがとうございました。 私はここでそれを見つけました:WPF: Remove dotted border around focused item in styled listbox

1

より良いMVVMのアプローチを使用して、タイプobservableCollection<UserNames>propertyにごlistbox.itemssourceをバインドします。

このようにして、observableCollectionからアイテムを削除すると、アイテムはlistboxから削除され、UIは自動的に更新されます。

この例では、PersonList binding to a listboxを示しています。これは役に立ちます。

1

MVVMは推奨パターンですが、質問に対する回答には必要ありません。

  1. リフレッシュが遅いことについて、他の質問について

のとおりのObservableCollection <>にあなたのリスト<>を変更し

  • INotifyPropertyChangedの
  • を実装する - あなたもそう仮想化を使用するようにリストボックスを設定し使用することができますボックス全体ではなく、画面上の項目のみが描画されます。

    0

    MVVMが推奨されますが、これはあなたのために働く必要があります。

    private void SetUpData()//call this just once 
    { 
        this.users = new ObservableCollection<UserNames>(); 
        this.users.Add(new UserNames() {Id = 1, UserName = "name 1"}); 
        this.users.Add(new UserNames() { Id = 2, UserName = "name 2" }); 
        this.users.Add(new UserNames() { Id = 3, UserName = "name 3" }); 
        this.users.Add(new UserNames() { Id = 4, UserName = "name 4" }); 
        this.users.Add(new UserNames() { Id = 5, UserName = "name 5" }); 
        this.users.Add(new UserNames() { Id = 6, UserName = "name 6" }); 
        this.users.Add(new UserNames() { Id = 7, UserName = "name 7" }); 
        this.users.Add(new UserNames() { Id = 8, UserName = "name 8" }); 
        this.users.Add(new UserNames() { Id = 9, UserName = "name 9" }); 
        this.users.Add(new UserNames() { Id = 10, UserName = "name 10" }); 
        this.listBox1.DataContext = users; 
    } 
    
    
    private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
        UserNames itemToRemove = (UserNames)((ListBox)sender).SelectedItem; 
        MessageBox.Show(itemToRemove.UserName); 
    
        this.users.Remove(itemToRemove); // remove from list 
    } 
    
    関連する問題