0

我在 MVVM WPF 应用程序中有多个 ListViews,由 ObservableCollections 支持。

我正在为每个 ListView 实现一个“删除项目”上下文菜单项。目前,我将每个 ListView 的 SelectedItem 绑定到我的 ViewModel 中的同一对象。然而,从 ObservableCollection 中删除项目需要 ListView 的名称(在本例中为 Wk01CECollection):

    private void DeleteLO()
    {
        this.Wk01CECollection.Remove(SelectedCE);

    }

有没有办法引用 SelectedItem 所属的 ListView?因为它是我需要为每个 ListView 连接一个单独的删除方法。

4

2 回答 2

0

我确信这不是实现这一目标的“最佳实践”方式,但这很简单:

您可以将 ListView 的选定项作为参数传递给命令:

 <Button Content="Delete selected item" Command="{Binding DeleteCommand}" CommandParamenter="{Binding ElementName=SomeListView, Path=SelecteItem}" />

由于您可以尝试从 ObservableCollection 中删除一个项目,即使它在集合中不存在而不会出现异常,所以在您的私有 Delete 方法中,您可以尝试从您的 ViewModel 中的所有 ObservableCollection 中删除该项目。我在这里假设一个项目不能同时在两个集合中,如果不是这种情况,我所说的将不起作用,因为您将从所有集合中删除该项目。如果您打算这样做,只需在删除之前检查 null,如果您尝试删除 null 对象,您将收到异常。

private void DeleteLO(object listitem)
{
    if(listitem != null)
    {
        if(listitem as CollectionType1 != null) //cast your listitem to the appropiate type inside your collection
            this.Wk01CECollection.Remove(listitem);

        if(listitem as CollectionType2 != null) 
            this.Wk02CECollection.Remove(listitem);

        //etc.
    }
}

除此之外,如果您使用 MVVM,最好 ViewModel 不知道 View,因此在 VM 中引用 ListView 会破坏该原则。

于 2013-01-23T20:43:05.250 回答
0

我知道这个问题早已不复存在,但会为 googlers 发布。

这对我有用:

    private void LvPrevKeyDown(object sender, KeyEventArgs e)
    {
        //Nothing to do here
        if (Lv.SelectedItems.Count == 0) return;
        //Empty space for other key combinations

        //Let's remove items. If it's a simple delete key so we'll remove just the selected items.
        if (e.Key != Key.Delete || Keyboard.Modifiers != ModifierKeys.None) return;
        var tmp = Lv.SelectedItems.Cast<ColorItem>().ToList();
        foreach (var colorItem in tmp)
        {
            _cList.Remove(colorItem);
        }
    }

xaml 中没有什么特别的。当然,只是一些绑定到 _cList 属性的列和绑定到 _cList 的项目源。

希望它会帮助别人!亲切的问候!

于 2014-09-26T12:49:33.127 回答