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

时间:2011-04-26 16:34:21

标签: wpf data-binding 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();
    }

和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>

4 个答案:

答案 0 :(得分:13)

每个DataContext的{​​{1}}是字符串本身,因此绑定的路径为空(ListBoxItem)。 .TwoWay绑定需要一个路径,因为您不能只替换当前的OneWayToSource。因此,您需要将字符串包装在一个将字符串公开为属性的对象中:

DataContext

将字符串公开为public class StringItem { public string Value { get; set; } }

的列表
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(); } 属性:

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> 还需要实现StringItem,以便自动更新绑定。您还应该将列表公开为INotifyPropertyChanged而不是ObservableCollection<T>

答案 1 :(得分:1)

也许有帮助?

<ListBox Name="lsbList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=Value}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 2 :(得分:0)

你可以使用itemscontrol和textboxes创建一个DataGridTemplateColumn.CellEditingTemplate来编辑你的项目

答案 3 :(得分:0)

如果我没有误解你的问题,那么很容易实现。看:

<ComboBox Text="My Comment 5 with addition." IsEditable="True" Height="25" Width="200">
        <ComboBoxItem>My comment1</ComboBoxItem>
        <ComboBoxItem>My comment2</ComboBoxItem>
</ComboBox>