WPF Слушайте удаление ListViewItem

Я хочу "Прослушать" мой основной ListView и если один или несколько элементов будут удалены, их клоны в другом ListView также будут удалены.

Например: У меня есть 5 элементов в главном ListView Во втором ListView меня есть 2 клонированных элемента (их позиция в основном ListView 0 и 2) В третьем ListView меня есть еще 2 клонированных элемента (их позиция в основном "ListView" равна 0 и 4)

Когда я удаляю номер позиции 0 из основного ListView, я хочу, чтобы он был удален из всех его клонов из другого ListView.

Прямо сейчас, что я делаю, когда элемент удален из основного ListView, я прохожу через другой ListView чтобы проверить, совпадает ли он с удаленным, если он удаляет их.

Я читал о ObservableCollection но я не могу понять, как реализовать его для моих нужд... был бы признателен за помощь/легкое руководство, которое объяснит просто, как это сделать.

РЕДАКТИРОВАТЬ: Это решение WinForms - я не знаю, как преобразовать его в WPF-решение, и я даже не уверен, что это то, что мне нужно http://www.codeproject.com/Articles/4406/An-Observer-Pattern-and-an-Extended-ListView-Event

2 ответа

Чтобы проиллюстрировать мою точку зрения из раздела комментариев, скажем, у вас есть UserControl называемый WindowItem который реализует метод 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>
 </grid></usercontrol><button content="Click me"><code> 
 

</code> <p> Я создаю класс, который будет содержать множественные коллекции <code>WindowItem</code></p> <pre class="prettyprint linenums">public class MainWindowViewModel
{
 public MainWindowViewModel()
 {

 }

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

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

 public ObservableCollection<windowitem> ThirdCollection { get; set; }
}
</windowitem></windowitem></windowitem>

Я также создаю View contaning three ListViews, привязанный к моим коллекциям через Data Bindings

<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">
<grid>
 <stackpanel>
 <listview itemssource="{Binding FirstCollection}">
 <listview itemssource="{Binding SecondCollection}">
 <listview itemssource="{Binding ThirdCollection}">
 </listview></listview></listview></stackpanel>
</grid>
</window>

Затем в конструкторе моего MainWindow (известного как View) я установил его DataContext как класс, который я создал ранее (известный как ViewModel в 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;
 }
</windowitem></windowitem></windowitem>

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

Надеюсь это поможет


Вместо добавления и удаления элементов непосредственно в/из объекта ListView свяжите его с какой-либо коллекцией (предпочтительно Observable Collection) и добавьте/удалите элементы из ObservableCollection, это также отразится на вашем пользовательском интерфейсе.

например

ObservableCollection<windowitem> MyCollection=new ObservableCollection<windowitem>();
</windowitem></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
}

licensed under cc by-sa 3.0 with attribution.