wpf добавление новых элементов в список - PullRequest
0 голосов
/ 03 августа 2011

Извините, если синтаксис выключен, я набрал его в блокноте (временные проблемы с компьютером с VS)

у меня есть класс Movie со свойством Title, у меня есть

 Dim movieList = New ObservableCollection(of Movie) 

 Private Sub SelectMovie(ByVal sender As Object, ByVal e As SelectionChangedEventArgs)

  For Each m As Movie in movieList
    If lb1.SelectedItem = "New" Then
      m.Add(New Movie()) 
    End If
   Next

 End Sub 

movieList был инициализирован временными значениями, последнее из которых "New" .
В конструкторе я перебрал movielist и поместил вещи в список.

lb1.Items.Add(m)

В MainWindow.xaml у меня есть

 <Grid Name="moviePage" > 
   <ListBox Name="lb1" SelectionChanged="SelectMovie">
 </Grid>

Я знаю, что этот подход неправильный, так как я изменяю список при его использовании, но я не могу найти способ обойти это.

Идея состоит в том, чтобы просто в списке отображалась куча фильмов с возможностью добавления нового фильма, если "Новый" выбран из списка.

1 Ответ

4 голосов
/ 03 августа 2011

Вот пример рабочего кода:

public MainWindow()
{
    InitializeComponent();

    _movies = new ObservableCollection<Movie>(
        new[]
        {
            new Movie { Name = "Foo" },
            new Movie { Name = "Bar" },
            new Movie { Name = "(New)" },
        });
    lb1.ItemsSource = _movies;
}

ObservableCollection<Movie> _movies;

private void SelectMovie(object sender, SelectionChangedEventArgs e)
{
    var selectedMovie = lb1.SelectedItem as Movie;
    if (selectedMovie == null) return;

    if (selectedMovie.Name == "(New)")
    {
        var newMovie = new Movie { Name = "Untitled" };
        _movies.Insert(_movies.Count - 1, newMovie);
        lb1.SelectedItem = newMovie;
        e.Handled = true;
    }
}

Сказав это, я не верю, что это правильный подход к тому, что вы делаете.Я думаю, вам лучше изменить шаблон для ListBox, чтобы он отображал список элементов, с которыми он связан, а затем кнопку «Создать» или ссылку внизу (вне списка).Вот очень простой пример:

<ListBox x:Name="lb1" DisplayMemberPath="Name" SelectionChanged="SelectMovie">
    <ListBox.Template>
        <ControlTemplate>
            <StackPanel>
                <ItemsPresenter />
                <Button Click="AddMovie>New Movie</Button>
            </StackPanel>
        </ControlTemplate>
    </ListBox.Template>
</ListBox>

Итак, теперь у вас есть ListBox, в котором есть кнопка для создания нового фильма.В обработчике событий AddMovie вы можете добавить в список новый экземпляр Movie и выбрать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...