wpf将新项添加到列表框中

时间:2011-08-02 22:55:12

标签: wpf listbox wpf-controls binding observablecollection

对不起,如果语法关闭,我在记事本上键入了这个,(带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初始化为临时值,最后一个是“新” 在构造函数中,我通过movielist迭代并将内容放入列表框中。

lb1.Items.Add(m)

MainWindow.xaml 我有

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

我知道这种方法是错误的,因为我在使用它时修改了一个列表,但我似乎无法找到解决方法。

我们的想法是让列表框显示一堆电影,如果从列表中选择“新建”,则可以添加新电影。

1 个答案:

答案 0 :(得分:4)

这是一个有效的代码示例:

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实例添加到列表中并选择它。