c# - 可编辑的 WPF 列表框

标签 c# wpf data-binding

我有一个绑定(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/

相关文章:

c# - 如何将 ImageSource 设置为 Xamarin.Forms.Button?

c# - 从一组控制台应用程序中干净地杀死一个控制台应用程序

c# - WPF 并发模型

silverlight - 在 MVVM Light 中将文本 block 绑定(bind)到文本框

c# - MVC 4 - 如何将模型数据传递给局部 View ?

c# - 存储在 oracle 中的 GUID/RAW 几乎匹配,除了最后 4 个字符

c# - 格式化某些绑定(bind)到 Repeater 的项目的输出

c# - 在 GridView 中显示增量数据的最佳方式是什么?

c# - 如何使绑定(bind)到 Nullable<int> 属性的 DropDownListFor 接受空值?

c# - 如何从 WPF DataGrid 的单元格中读取值?