How to make ListBox editable when bound to a List?

前端 未结 4 948
清酒与你
清酒与你 2020-12-03 13:26

Edit: The basic problem is binding a List to ListBox(or any other control). So I am editing the question.

I bound a list of string to a ListBox as b

相关标签:
4条回答
  • 2020-12-03 13:39

    If I didn't misunderstand your question, it is pretty easy to implement. Look:

    <ComboBox Text="My Comment 5 with addition." IsEditable="True" Height="25" Width="200">
            <ComboBoxItem>My comment1</ComboBoxItem>
            <ComboBoxItem>My comment2</ComboBoxItem>
    </ComboBox>
    
    0 讨论(0)
  • 2020-12-03 13:51

    May be it helsp?

    <ListBox Name="lsbList">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Path=Value}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
    0 讨论(0)
  • 2020-12-03 13:56

    you can create a DataGridTemplateColumn.CellEditingTemplate with an itemscontrol and textboxes to edit your items

    0 讨论(0)
  • 2020-12-03 13:58

    The DataContext of each ListBoxItem is the string itself, so the path of your binding is empty (.). TwoWay and OneWayToSource bindings require a path, since you can't just replace the current DataContext. So you need to wrap your string in an object that exposes the string as a property:

    public class StringItem
    {
        public string Value { get; set; }
    }
    

    Expose the strings as a list of 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();
        }
    

    And bind to the Value property:

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

    Note that StringItem will also need to implement INotifyPropertyChanged so that bindings are automatically updated. You should also expose the list as an ObservableCollection<T> rather than a List<T>

    0 讨论(0)
提交回复
热议问题