Как сделать ListBox редактируемым при привязке к списку <string>? - PullRequest
3 голосов
/ 26 апреля 2011

Редактировать : Основная проблема - привязка 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 ]

13 голосов
/ 27 апреля 2011

DataContext каждого 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>, а не List<T>

1 голос
/ 27 апреля 2011

Может быть, это поможет?

<ListBox Name="lsbList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=Value}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0 голосов
/ 24 октября 2014

Если я не понял вашего вопроса, это довольно легко реализовать.Смотри:

<ComboBox Text="My Comment 5 with addition." IsEditable="True" Height="25" Width="200">
        <ComboBoxItem>My comment1</ComboBoxItem>
        <ComboBoxItem>My comment2</ComboBoxItem>
</ComboBox>
0 голосов
/ 27 апреля 2011

вы можете создать DataGridTemplateColumn.CellEditingTemplate с контролем элементов и текстовыми полями для редактирования ваших элементов

...