绑定到List <string>时如何使ListBox可编辑?

Jim*_*mmy 3 data-binding wpf listbox wpfdatagrid

编辑:基本问题是将List绑定到ListBox(或任何其他控件).所以我正在编辑这个问题.

我将一个字符串列表绑定到ListBox,如下所示.但是,当我更改文本框的内容时,它不会更改源列表中的字符串.为什么?

  public partial class MainWindow : Window
{
    List<string> _nameList = null;

    public List<string> NameList
    {
        get
        {
            if (_nameList == null)
            {
                _nameList = new List<string>();
            }
            return _nameList;
        }
        set
        {
            _nameList = value;
        }
    }
    public MainWindow()
    {
        NameList.Add("test1");
        NameList.Add("test2");
        InitializeComponent();
    }
Run Code Online (Sandbox Code Playgroud)

和XAML

 <ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding .,Mode=OneWayToSource ,  UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 14

DataContext每个ListBoxItem是字符串本身,所以你的绑定的路径是空的(.).TwoWayOneWayToSource绑定需要一个路径,因为你不能只是替换当前DataContext.因此,您需要将字符串包装在一个将字符串作为属性公开的对象中:

public class StringItem
{
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将字符串公开为以下列表StringItem:

public partial class MainWindow : Window
{
    List<StringItem> _nameList = null;

    public List<StringItem> NameList
    {
        get
        {
            if (_nameList == null)
            {
                _nameList = new List<StringItem>();
            }
            return _nameList;
        }
        set
        {
            _nameList = value;
        }
    }
    public MainWindow()
    {
        NameList.Add(new StringItem { Value = "test1" });
        NameList.Add(new StringItem { Value = "test2" });
        InitializeComponent();
    }
Run Code Online (Sandbox Code Playgroud)

并绑定到Value属性:

<ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

请注意,StringItem还需要实现INotifyPropertyChanged以便自动更新绑定.您还应该将列表公开为ObservableCollection<T>而不是List<T>