2011-09-14 83 views
2

嗨我想做這樣的事情我想從ListView的本身更新ListView的源,這樣我就不必修改另一個對象中的ListView在其中的源代碼。我想從ListView中刪除項目嘗試,但當然這是行不通的WPF ListView更新來源ListView

無效delete_Click(對象發件人,RoutedEventArgs E) {

 List<EntityObject> items = new List<EntityObject>(); 

     foreach (EntityObject item in listView.SelectedItems) 
     { 
      itemsToBeDeleted.Add(item); 
     } 

     OnDeleteItems(items);//Database delete logic in here 

     listView.Items.Remove(items.First());//After DataBase delete also delete the item from the listview's source so that listView' itself will be updated too. 

     listView.Refresh(); 

     listView.SelectedItem = null; 
    } 

,我不想將源列表ListView作爲參考,並在ListView中更新如下

公共無效SETLIST(參考文獻列表itemList中) {

 sauce =itemlist; 
     list.ItemsSource = itemList; 

}


sauce.Items.Remove(items.First());

任何想法?

回答

0

我可以建議使用MVVM設計模式進行一些研究嗎?如果你這樣做,你會發現處理這個和其他場景的更簡潔的方式。例如,假設您有一個EntityObject Person(我假設您使用的是EF),您想要在列表中顯示並通過單擊按鈕進行刪除。首先,我們將創建一個將保存列表列表框:

<ListBox x:Name="lst" DisplayMemberPath="Name" SelectionMode="Extended"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
      </Style> 
     </ListBox.ItemContainerStyle>    
    </ListBox> 

在這裏,你指定要在列表中(DisplayMemberPath)來顯示什麼,你的ListBox的選擇綁定到人的IsSelected屬性。

然後,我們可以繼續綁定一個ObservableCollection<Person>這個列表框:

//in code behind constructor, but should actually be in a ViewModel 
var people = new ObservableCollection<Person> 
         { 
           new Person(false, "test1"), 
           new Person(true, "test2"), 
           new Person(true, "test3"), 
         }; 
lst.ItemsSource = people; 


//Person class for completeness 
public class Person 
{ 
    public Person(bool isSelected, string name) 
    { 
     IsSelected = isSelected; 
     Name = name; 
    } 

    public bool IsSelected { get; set; } 
    public string Name { get; set; } 
} 

,然後它的一塊蛋糕,以刪除項目的一個按鈕被點擊時:

public void deleteClick(sender, args){ 
    var deleteme = people.Where(p => p.IsSelected).ToList(); 

    DoDeleteLogicInDB(deleteme); 

    deleteme.ForEach(p => people.Remove(p)); 
    //remove it from the observablecollection, and the view will automatically update. 
} 

希望這會讓你指向正確的方向!