gpt4 book ai didi

c# - 可编辑的 WPF 列表框

转载 作者:太空狗 更新时间:2023-10-29 22:56:23 25 4
gpt4 key购买 nike

我有一个绑定(bind)到 WPF 中的 ListBox 的 ObservableCollection。我希望 ListBox 是可编辑的,并将编辑更改保存到集合中。由于 WPF 不提供可编辑的列表框,我尝试通过更改 ListBox.ItemTemplate 创建我自己的列表框。

<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Name="EditableText" Text="{TemplateBinding Content}"/>
</DataTemplate>
</ListBox.ItemTemplate>

更改 ItemTemplate 为我提供了可编辑框,但对文本框的任何更改都不会保存到 ObservableCollection。有没有办法让可编辑的 ListBox 具有双向绑定(bind)?

最佳答案

你不能这样做。

要实现这种技巧,您需要将项目设为“持有者类”,以公开可以将文本框绑定(bind)到的属性。

要理解它,请想象以下伪调用序列:

class ListBox
{
Bind(Items)
{
foreach(var item in Items)
{
DataTemplate Template = LoadTemplateForItem(item.GetType()); // this is where your template get loaded
Template.Bind(item); //this is where your template gets bound
}
}
}

您的模板(带有列表框的 DataTemplate)已加载,并且项目(我假设在您的情况下是一个字符串)被传入。此时,它只知道字符串,不能向上影响任何东西。双向绑定(bind)不会影响集合,因为模板不知道它在哪个上下文中使用,因此它无法返回到原始集合并修改其内容。就此而言,这与 TextBox 相同。如果没有给它一个容器和一个属性名称,它就没有地方可以“存储”更改。这与将字符串传递给函数调用基本相同。该函数无法更改传入的字符串(忽略通过引用参数传递等技巧)。

回到您的案例,您需要构建一个对象集合,这些对象公开一个包含需要编辑的值的属性:

public class MyDataItem
{
string Data { get; set;}
}

然后您可以将您的 ListBox 绑定(bind)到这些项目的集合并修改您的数据模板:

<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Name="EditableText" Text="{Binding Data, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>

关于c# - 可编辑的 WPF 列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com