使用 ListBox 本身内部的“添加”按钮添加 ListBoxItem

Posted

技术标签:

【中文标题】使用 ListBox 本身内部的“添加”按钮添加 ListBoxItem【英文标题】:Add ListBoxItem with "Add" button that is inside the ListBox itself 【发布时间】:2019-04-29 09:07:11 【问题描述】:

所以,问题是:我有一个 ListBox,里面有一个 ItemsTemplate,还有一个按钮已经进入 ItemsCollection,女巫是“添加项目”按钮。这个想法是通过单击“添加项目”按钮从该列表框中的 ItemsTemplate 添加一个新项目,在我想要添加新项目的同一个列表框中的另一个 ListBoxItem 中。我知道我可以将“添加项目”按钮留在 ListBox 之外,但我真的很喜欢按钮位于 ListBox 最底部的想法,因为它更直观,所以我必须从模板中添加一个新项目,但不能只绑定 ItemsSource 属性,因为在使用它之前它必须为空,并且它具有带有添加按钮的 ListBoxItem,这是其中唯一的非模板项,然后我必须确保按钮移至列表底部。

找了好久,没找到。

【问题讨论】:

使用正常流程将项目添加到列表框 代替itemtemplate,定义两个用于2种数据类型的模板,分别称为rowVM和buttonVM。 rowVM 模板到您现在拥有的任何内容中。 ButtonVM 模板转换成一个按钮。绑定一个 observablecollection 并添加到众多 rowvm 中,然后添加一个 buttonvm。使用 relativesource 将按钮绑定到 windowViewmodel 中的命令。添加 RowVM 时,请使用 insert。您也可以在单独的集合中使用带有 buttonvm 的复合集合。 【参考方案1】:

您可以将CompositeCollection 用作ItemSource 作为您的ListBox,因此您的“添加项目”按钮始终是您的ListBox 中的最后一个项目,也不属于您的源集合。

    <ListBox>
        <ListBox.Resources>
            <!-- Your Datatemplates -->
        </ListBox.Resources>
        <ListBox.ItemsSource>
            <CompositeCollection>
                <!-- Bind your original ItemsSource here, in my case 'Collection' -->
                <CollectionContainer Collection="Binding Source=StaticResource mainViewModel, Path=Collection"/>
                <!-- Focusable="False" not selectable -->
                <ListBoxItem Focusable="False">
                    <Button Command="Binding Source=StaticResource mainViewModel, Path=AddItemCommand">Add Item</Button>
                </ListBoxItem>
            </CompositeCollection>
        </ListBox.ItemsSource>
    </ListBox>

另请参阅How do you bind a CollectionContainer to a collection in a view model? 为什么需要在绑定中指定源

【讨论】:

以上是关于使用 ListBox 本身内部的“添加”按钮添加 ListBoxItem的主要内容,如果未能解决你的问题,请参考以下文章

如何为ListBox的每个项添加“删除”按钮并实现其功能?

多线程操作(循环往listbox中添加数据)

将数据绑定到 ListBox 并将列表发布到数据库 mvc5

在 Javascript 中以自然方式添加后,我无法在 asp.net 中获取 Listbox 的值

VB中的list控件是啥?

c# listbox 添加一次就显示一行,请问下怎么实现