列表对象绑定 - 从列表项控件中更改模型列表

时间:2011-12-15 14:50:04

标签: wpf binding wpf-controls

我有什么:

我有一个名为Job的Model对象,其中包含JobTaskObservableCollection的列表 - 让我们调用此taskList。我通过Job - (System.Windows.Controls.ItemsControl)显示ItemsControl,其ItemsSource绑定到taskList。通过将ItemsControl.Template设置为自定义DataTemplate来显示UserControl - 让我们调用此JobTaskDisplayPanel,其中包含与jobTask相关的UIControl,例如标题,描述,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的{​​{1}}(模型列表)进行更改,具体来说我想在每个JobTaskDisplayPanel中添加一个“删除”按钮按下JobTaskDisplayPanel时,会从其父级JobTask中删除taskList,从而将其从应用程序模型中删除。

2 个答案:

答案 0 :(得分:1)

我要求你的JobTask有一个名为Parent的属性,该属性会引用与之关联的Job,所以你可以去

this.Parent.RemoveTask(this);

或者我会使用某种EventSystem,例如Prism的EventAggregator或MVVM Light Messenger。在这种情况下,您的JobTask会广播一条消息,说明要将其自身从拥有它的任何内容中移除,Job对象将订阅接收这些消息,如果它包含JobTask中的消息事件消息,它将删除它。

答案 1 :(得分:0)

由于您使用的是ItemsControl,因此单击该按钮时不会收到SelectedIndex或SelectedItem,就像使用ListBox一样。现在,这会强制您的项目告诉DataContext管理它需要删除的项目集合。

您需要做的是将删除按钮添加到Panel。在项目的DataContext中创建一个新事件,将其命名为OnDelete。将按钮的命令绑定到Item上的方法,该方法将引发OnDelete事件并将其自身作为发送方传递。您的jobTasksList所在的父DataContext将需要处理此事件并将其从ItemsControls Items集合中删除。将事件的对象发件人作为项目的类投射后,您可以找到该项目。

您也可以使用它作为命令参数将项目传递给Delete方法,但由于您必须通知项目管理器的管理器项目被删除,因此它并不能真正为您购买任何东西。