可编辑的WPF ListBox

Dan*_*ney 5 c# data-binding wpf

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

<ListBox.ItemTemplate>
    <DataTemplate>                      
        <TextBox Name="EditableText" Text="{TemplateBinding Content}"/>
    </DataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

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

Den*_*ler 8

你不能这样做.

要实现这种技巧,您需要将您的项目设置为"持有者类",以显示可以将文本框绑定到的属性.

要理解它,想象下面的伪调用序列:

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你的模板(带有列表框的DataTemplate)被加载,并且项目(我假设你的情况下是一个字符串)被传入.此时,它只知道字符串,并且不能向上影响任何东西.双向绑定不能影响集合,因为模板不知道它在哪个上下文中使用,因此它无法返回到原始集合并修改其内容.就此而言,TextBox也是如此.如果没有给出变量和属性名称,则无法"存储"更改.这与将字符串传递给函数调用基本相同.该函数无法更改传入的字符串(忽略诸如by-reference参数传递之类的技巧).

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

public class MyDataItem
{
  string Data { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将ListBox绑定到这些项的集合并修改您的datatemplate:

<ListBox.ItemTemplate>
    <DataTemplate>                                              
            <TextBox Name="EditableText" Text="{Binding Data, Mode=TwoWay}"/>
    </DataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)