0

我想“听”我的主要ListView内容,如果删除了一个或多个项目,它们在其他ListViews 中的克隆也将被删除。

例如:
我在 main 中有 5 个项目在ListView
第二个中ListView我有 2 个克隆项目(它们在 main 中的位置ListView是 0 和 2)
在第三个中ListView我有另外 2 个克隆项目(它们在 main `ListView 中的位置是 0 和 4 )

当我从 main 中删除项目编号 0 时ListView,我希望将其从其他ListViews 的所有克隆中删除。

现在,我正在做的是,当 item 从 main中删除时ListView,我循环遍历其他ListViews 以检查它是否与删除的匹配,如果匹配,我也将它们删除。

我读到了,ObservableCollection但我不明白如何根据我的需要来实现它......将不胜感激帮助/简单的指南,它将简单地解释如何做到这一点。

编辑:
这是 WinForms 解决方案 - 我不知道如何将其转换为 WPF 解决方案,而且我什至不确定这是否是我需要的
http://www.codeproject.com/Articles/4406/An-Observer-Pattern- and-an-Extended-ListView-Event

4

2 回答 2

2

为了从评论部分说明我的观点,假设您有一个实现方法的UserControl调用:WindowItemClone

<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>

我创建了一个包含多个集合的类WindowItem

public class MainWindowViewModel
{
    public MainWindowViewModel()
    {

    }

    public ObservableCollection<WindowItem> FirstCollection { get; set; }

    public ObservableCollection<WindowItem> SecondCollection { get; set; }

    public ObservableCollection<WindowItem> ThirdCollection { get; set; }
}

我还创建了一个包含View三个ListViews,通过数据绑定绑定到我的集合

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <StackPanel>
        <ListView ItemsSource="{Binding FirstCollection}"/>
        <ListView ItemsSource="{Binding SecondCollection}"/>
        <ListView ItemsSource="{Binding ThirdCollection}"/>
    </StackPanel>
</Grid>
</Window>

接下来,在我的 MainWindow(称为View)的构造函数中,我将它的DataContextViewModel设置为我之前创建的类(称为MVVM)。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    }
}

现在,我可以为不同的集合创建用户控件的克隆,在我的视图中显示在不同的列表中,并注册到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;
    }

FirstCollectionChanged将在第一个集合更改时触发。您可以“侦听”删除操作,然后从其他集合中删除匹配的项目。

     private void FirstCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            // Remove matching item from second and third collection.
        }
    }

您可以通过从第一个集合中删除一个项目来测试它

FirstCollection.RemoveAt(0);

希望这可以帮助

于 2013-10-06T19:15:32.217 回答
1

不是直接向 ListView 对象添加和删除项目,而是将其绑定到某个集合(最好是 Observable Collection)并从 ObservableCollection 添加/删除项目,它也会反映在您的 UI 上。

例如

ObservableCollection<WindowItem> MyCollection=new ObservableCollection<WindowItem>();

然后添加项目

MyCollection.Add(new WindowItem(parameters));

为了从克隆的列表视图中显示您的项目,请将事件处理程序添加到您的主要 ObservableCollection 中,例如

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

void CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    //bind your another listviews to cloned items
}
于 2013-10-06T19:14:43.337 回答