【问题标题】:List object Binding - altering the model list from within the list item control列表对象绑定 - 从列表项控件中更改模型列表
【发布时间】:2011-12-15 14:50:04
【问题描述】:

我有什么:

我有一个名为 Job 的 Model 对象,它在 ObservableCollection 中保存了 JobTask 的列表 - 我们称之为 taskList。我通过将ItemsControl 绑定到taskListItemsControl - (System.Windows.Controls.ItemsControl) 来显示Job。它的ItemsControl.Template 是通过将其DataTemplate 设置为定制的UserControl 来显示的——我们称之为JobTaskDisplayPanel,它具有与jobTask 相关的UIControls,例如标题、描述、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;

我想要什么:

我想知道如何从每个JobTaskDisplayPanel 中更改taskList(型号列表),特别是我想在每个@987654338 中放置一个“删除”按钮@'s 按下时会从其父级的taskList 中删除JobTask,从而将其从应用程序模型中删除。

【问题讨论】:

    标签: wpf binding wpf-controls


    【解决方案1】:

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

    this.Parent.RemoveTask(this);
    

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

    【讨论】:

    • 是的,我已经完成了父引用方法。这感觉像是一种非常肮脏的做事方式。我对这种情况的改进的第一个想法是能够绑定到父 UserControl 的代码隐藏方法,或者更好地能够调用父 DataContext 上的方法。
    • @user989056 JobTask 知道 Job 属于什么对我来说很有意义,所以我认为 Parent 属性没有任何问题。如果您愿意,您还可以将可能重命名为 Job,因为 Parent 听起来就像您在浏览 UI 或做一些骇人听闻的事情。
    【解决方案2】:

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

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

    您也可以使用它作为命令参数将项目传递给 Delete 方法,但是由于您已经必须通知 Items Collection 的经理该项目已被删除,它并没有真正为您买任何东西。

    【讨论】:

    • 我不明白如何实现你所说的,也许你的术语让我感到困惑。 “在项目的 DataContext 中创建一个新事件,将其命名为 OnDelete。”项目的 DataContext 是什么?您是在谈论 JobTaskDisplayPanel 背后的代码还是它所代表的 Model 类 - JobTask
    • 用词不当。那将是项目集合的任何类别。因此,如果您的项目是 JobTask 对象的集合,则您需要在 JobTask 中添加 OnDelete 事件。如果您的 ItemsSource 是 JobTaskDisplayPanel 的集合,那么它需要在 JobTaskDisplayPanel 中。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多