2011-09-14 49 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. 
} 

希望这会让你指向正确的方向!