2011-12-15 3 views
0

Что у меня есть:объекта списка Binding - изменение списка модели из управления элементом списка

У меня есть объект Модели называется Job который содержит список JobTask-й в ObservableCollection - давайте назовем это taskList , Я показываю Job, имея ItemsControl - (System.Windows.Controls.ItemsControl), у которого есть ItemsSource, связанный с taskList. Это ItemsControl.Template отображается, если у него DataTemplate настроено на заказ UserControl - назовем это JobTaskDisplayPanel, у которого есть UIControls, относящийся к jobTask, например. название, описание, iscomplete и т. д. Эта настройка в настоящее время работает, и она отображает список JobTaskDisplayPanel с связанной информацией в ItemsControl.

код Пример:

ItemsControl XAML:

 <ItemsControl ItemsSource="{Binding}" Name="jobsTaskList"> 
      <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ucs:JobTaskDisplayPanel Margin="4"/> 
        </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

Как я связываю с этим (я привязать к нему из кода):

jobsTaskList.ItemsSource = currentJob.taskList; 

Что я хочу:

Я хотел бы знать, как внести изменения в список taskList (список моделей) от каждого отдельного JobTaskDisplayPanel, в частности, я хотел бы поместить кнопку «Удалить» в каждом из JobTaskDisplayPanel, который при нажатии будет удалите JobTask из его родительского taskList, тем самым удалив его из приложения Model.

ответ

1

Я бы либо у вашего JobTask имеет свойство, называемое Parent, который будет ссылаться на Job это было связанно с, так что вы можете пойти

this.Parent.RemoveTask(this); 

или я бы использовать какие-то EventSystem, такие как призмы EventAggregator или MVVM Light's Messenger. В этом случае ваш JobTask будет транслировать сообщение, говорящее, чтобы удалить его из того, что принадлежит ему, и объект Job будет подписаться на получение этих сообщений, и если в нем будет JobTask, который находится в сообщении о событии, он удалит его.

+0

Да, я сделал это методом родительской ссылки. Это похоже на очень грязный способ делать что-то. Моей первой идеей улучшения для этой ситуации было бы иметь возможность привязываться к методу «code-behind» родительского UserControl или даже лучше иметь возможность вызывать методы в DataContext родителя. – user989056

+0

@ user989056 Для меня имеет смысл, что 'JobTask' будет знать, к какому' Job' принадлежит, поэтому я не вижу ничего плохого в свойстве Parent. Вы могли бы также переименовать, вероятно, что-то вроде 'Job', если хотите, поскольку Parent заставляет его звучать как ваш навигационный интерфейс или делать что-то хакерское. – Rachel

0

Поскольку вы используете элемент ItemsControl, вы не будете получать SelectedIndex или SelectedItem при нажатии кнопки, как и в ListBox. Это теперь заставляет ваш элемент сообщать DataContext об управлении сборкой элементов, которую требуется удалить.

Что вам нужно сделать, это добавить кнопку удаления на панель. Создайте новое событие в DataContext элемента, назовите его что-то вроде OnDelete. Привяжите команду кнопки к методу на вашем элементе, который поднимет событие OnDelete и передаст себя в качестве отправителя. Ваш родительский DataContext, в котором находится ваш ресурс jobTasksList, должен будет обработать это событие и удалить его из коллекции ItemsControls Items. Вы можете найти элемент, как только вы передадите объект-отправитель события в качестве своего класса элемента.

Вы также можете передать элемент методу Delete, используя его в качестве параметра команды, но поскольку вам уже нужно уведомить менеджера о коллекции предметов, элемент будет удален, вы ничего не купите.

+0

Я не понимаю, как можно было бы реализовать то, что вы сказали, может быть, ваша терминология меня сбивает с толку. «Создайте новое событие в DataContext элемента, назовите его что-то вроде OnDelete». Что такое DataContext объекта? Вы говорите о коде, лежащем в основе класса JobTaskDisplayPanel или класса Model, который он представляет, - 'JobTask'? – user989056

+0

Это был плохой выбор слов. Это будет любой класс коллекции предметов. Поэтому, если ваши объекты представляют собой набор объектов JobTask, в JobTask вам нужно добавить событие OnDelete. Если вы ItemsSource - это коллекция JobTaskDisplayPanel, то это должно быть в JobTaskDisplayPanel. – Josh

Смежные вопросы