C# WPF侦听ListViewItem删除

C# WPF侦听ListViewItem删除,c#,wpf,listview,observablecollection,listviewitem,C#,Wpf,Listview,Observablecollection,Listviewitem,我想“收听”我的主列表视图,如果删除了一个或多个项目,那么它们在另一个列表视图中的克隆也将被删除。 例如: 我在主列表视图中有5项 在第二个列表视图中我有两个克隆项(它们在主列表视图中的位置是0和2) 在第三个列表视图中我还有另外两个克隆项(它们在主“列表视图”中的位置是0和4) 当我从主列表视图中删除项目编号0时,我希望它从其他列表视图的所有克隆中删除。 现在,我正在做的是,当项目从主列表视图中删除时,我循环通过其他列表视图来检查它是否与删除的项目匹配,如果匹配,我也会删除它们 我读到了有关可

我想“收听”我的主
列表视图
,如果删除了一个或多个项目,那么它们在另一个
列表视图
中的克隆也将被删除。

例如:
我在主
列表视图中有5项
在第二个
列表视图中
我有两个克隆项(它们在主
列表视图中的位置是0和2)
在第三个
列表视图中
我还有另外两个克隆项(它们在主“列表视图”中的位置是0和4)

当我从主
列表视图
中删除项目编号0时,我希望它从其他
列表视图
的所有克隆中删除。

现在,我正在做的是,当项目从主
列表视图中删除时,我循环通过其他
列表视图来检查它是否与删除的项目匹配,如果匹配,我也会删除它们

我读到了有关可观察收集的
,但我不知道如何根据我的需要实现它。。。希望您能提供帮助/简单指南,简单解释如何操作

编辑:
这是WinForms解决方案-我不知道如何将其转换为WPF解决方案,而且我甚至不确定这是否是我需要的

将ListView对象绑定到某个集合(最好是可观察的集合)并从可观察的集合中添加/删除项目,而不是直接向ListView对象添加或从ListView对象中删除项目,它也会反映在您的UI上

乙二醇

为了显示克隆的ListView中的项目,请在主ObservableCollection中添加一个事件处理程序,如

MyCollection.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CollectionChanged);


将ListView对象绑定到某个集合(最好是可观察的集合)并从可观察的集合中添加/删除项目,而不是直接向ListView对象添加或从ListView对象中删除项目,它还将反映在您的UI上

乙二醇

为了显示克隆的ListView中的项目,请在主ObservableCollection中添加一个事件处理程序,如

MyCollection.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CollectionChanged);


将ListView对象绑定到某个集合(最好是可观察的集合)并从可观察的集合中添加/删除项目,而不是直接向ListView对象添加或从ListView对象中删除项目,它还将反映在您的UI上

乙二醇

为了显示克隆的ListView中的项目,请在主ObservableCollection中添加一个事件处理程序,如

MyCollection.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CollectionChanged);


将ListView对象绑定到某个集合(最好是可观察的集合)并从可观察的集合中添加/删除项目,而不是直接向ListView对象添加或从ListView对象中删除项目,它还将反映在您的UI上

乙二醇

为了显示克隆的ListView中的项目,请在主ObservableCollection中添加一个事件处理程序,如

MyCollection.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CollectionChanged);


为了说明我在评论部分的观点,假设您有一个名为
WindowItem
UserControl
实现了
Clone
方法:

<UserControl x:Class="WpfApplication1.WindowItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      <Button Content="Click me"/>  
    </Grid>
</UserControl>
我还创建了一个包含三个
列表视图的
视图
,通过

现在,我可以为不同的集合创建用户控件的克隆,显示在视图中的不同列表中,并注册到第一个集合的
CollectionChanged
事件。下面是一个从ViewModel构造函数执行此操作的示例

    public MainWindowViewModel()
    {
        FirstCollection = new ObservableCollection<WindowItem>();
        SecondCollection = new ObservableCollection<WindowItem>();
        ThirdCollection = new ObservableCollection<WindowItem>();

        var windowItem = new WindowItem();
        FirstCollection.Add(windowItem);            
        SecondCollection.Add(windowItem.Clone());

        // Register to collection changes notifications
        FirstCollection.CollectionChanged += FirstCollectionChanged;
    }
您可以通过从第一个集合中删除项来测试它

FirstCollection.RemoveAt(0);

希望这有助于说明我在评论部分的观点,假设您有一个名为
WindowItem
UserControl
,它实现了一个
Clone
方法:

<UserControl x:Class="WpfApplication1.WindowItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      <Button Content="Click me"/>  
    </Grid>
</UserControl>
我还创建了一个包含三个
列表视图的
视图
,通过

现在,我可以为不同的集合创建用户控件的克隆,显示在视图中的不同列表中,并注册到第一个集合的
CollectionChanged
事件。下面是一个从ViewModel构造函数执行此操作的示例

    public MainWindowViewModel()
    {
        FirstCollection = new ObservableCollection<WindowItem>();
        SecondCollection = new ObservableCollection<WindowItem>();
        ThirdCollection = new ObservableCollection<WindowItem>();

        var windowItem = new WindowItem();
        FirstCollection.Add(windowItem);            
        SecondCollection.Add(windowItem.Clone());

        // Register to collection changes notifications
        FirstCollection.CollectionChanged += FirstCollectionChanged;
    }
您可以通过从第一个集合中删除项来测试它

FirstCollection.RemoveAt(0);

希望这有助于说明我在评论部分的观点,假设您有一个名为
WindowItem
UserControl
,它实现了一个
Clone
方法:

<UserControl x:Class="WpfApplication1.WindowItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      <Button Content="Click me"/>  
    </Grid>
</UserControl>
我还创建了一个包含三个
列表视图的
视图
,通过

现在,我可以为不同的集合创建用户控件的克隆,显示在视图中的不同列表中,并注册到第一个集合的
CollectionChanged
事件。下面是一个从ViewModel构造函数执行此操作的示例

    public MainWindowViewModel()
    {
        FirstCollection = new ObservableCollection<WindowItem>();
        SecondCollection = new ObservableCollection<WindowItem>();
        ThirdCollection = new ObservableCollection<WindowItem>();

        var windowItem = new WindowItem();
        FirstCollection.Add(windowItem);            
        SecondCollection.Add(windowItem.Clone());

        // Register to collection changes notifications
        FirstCollection.CollectionChanged += FirstCollectionChanged;
    }
您可以通过从第一个集合中删除项来测试它

FirstCollection.RemoveAt(0);

希望这有助于说明我在评论部分的观点,假设您有一个名为
WindowItem
UserControl
,它实现了一个
Clone
方法:

<UserControl x:Class="WpfApplication1.WindowItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      <Button Content="Click me"/>  
    </Grid>
</UserControl>
我还创建了一个包含三个
列表视图的
视图
,通过

现在,我可以为不同的集合创建用户控件的克隆,显示在视图中的不同列表中,并注册到第一个集合的
CollectionChanged
事件。下面是一个从ViewModel构造函数执行此操作的示例

    public MainWindowViewModel()
    {
        FirstCollection = new ObservableCollection<WindowItem>();
        SecondCollection = new ObservableCollection<WindowItem>();
        ThirdCollection = new ObservableCollection<WindowItem>();

        var windowItem = new WindowItem();
        FirstCollection.Add(windowItem);            
        SecondCollection.Add(windowItem.Clone());

        // Register to collection changes notifications
        FirstCollection.CollectionChanged += FirstCollectionChanged;
    }
您可以通过从第一个集合中删除项来测试它

FirstCollection.RemoveAt(0);

希望这有帮助

当项目从主
列表视图中删除时,
可观察收集将通知您,但它不会“照顾”其他
列表视图中的克隆,您仍然需要自己处理。由于您已经实现了这一点,我正在做的是,当项目从主列表视图中删除时…
我看不出这对您有什么帮助您如何为其他
列表视图创建
克隆?是否有任何特殊原因导致它们不能只是对同一对象的引用?您不能将同一项添加到两个不同的ListView…,这些项是自定义UserControl,克隆函数位于UserControl类:public中