WPF从ListView中的绑定集合中删除元素

时间:2014-05-10 16:26:31

标签: c# xaml

我想将IEnumerable集合与ListView中的项绑定。我还想创建一个可以从中删除所选元素的按钮。是否有可能制作按钮的方法以及何时单击要从列表和集合中删除的所选元素?

1 个答案:

答案 0 :(得分:1)

有两种方法可以创建WPF应用程序,我不确定您是否使用MVVM模式,但这一点在全面都是相同的。请注意,有很多方法可以实现这一点,而这只是其中之一。

假设您有ObservableCollection类型Person。您可以在视图的代码隐藏文件或单独的ViewModel文件中从XAML部分或代码隐藏中绑定它。无论哪种方式,您最终都会得到一个控件,例如ListView能够告诉您正在选择的项目以及正在显示的值。在我的ViewModel(或窗口的简单代码隐藏)中,在使用选择时,我通常更喜欢知道在集合中选择了哪个项目,所以我将拥有这样的属性:

// Here we are assuming that my item collection is of type Person.
private Person _selectedItem;
public Person SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (_selectedItem == value)
        {
            return;
        }

        _selectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}

请注意,您必须在INotifyPropertyChanged或代码隐藏中实施ViewModel以获取有关更改内容的更新:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

...并绑定到我在SelectedItem(在XAML中)中显示的ListView属性:

SelectedItem="{Binding SelectedFile}"

所以,每当我想从我的收藏中删除一个项目时,我就会运行这样的东西:

private void Remove()
{
    if (SelectedItem == null)
    {
        return;
    }

    collection.Remove(SelectedItem);
}

有很多方法,但这就是我的方法。你甚至可以更具体地做这样的事情:

collection.RemoveAll(x => x.SSNNumber == SelectedItem.SSNNumber);

这取决于您获得的创意和具体程度。你没有给我们太多的细节,所以我猜这里你需要的是什么。

我绝对不会依赖index,因为如果你在XAML中排序而不是在你的代码隐藏/ ViewModel中排序,那么在删除过程中你最终会得到一个错误的index。如果选择index路由,则应在代码中进行排序,此时如果绑定完成正确,则XAML集合将更新为正确的顺序,并且所选项目将具有正确的索引。然而,这是一条糟糕的路线,所以我建议不要这样做。