wpf向列表框添加新项

wpf向列表框添加新项,wpf,listbox,wpf-controls,binding,observablecollection,Wpf,Listbox,Wpf Controls,Binding,Observablecollection,抱歉,如果语法是关闭的,我在记事本上键入了这个(带VS的计算机出现临时问题) 我有一个类电影,带有标题属性,我有 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.Selec

抱歉,如果语法是关闭的,我在记事本上键入了这个(带VS的计算机出现临时问题)

我有一个类
电影
,带有
标题
属性,我有

 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)
主窗口中.xaml我有

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

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


这样做的目的是让列表框显示一组电影,如果从列表中选择了“new”,则可以添加新电影。

下面是一个工作代码示例:

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;
    }
}
public主窗口()
{
初始化组件();
_电影=新的可观察集合(
新[]
{
新电影{Name=“Foo”},
新电影{Name=“Bar”},
新电影{Name=“(new)”},
});
lb1.ItemsSource=\u电影;
}
可观察收集电影;
私有void SelectMovie(对象发送者,SelectionChangedEventArgs e)
{
var selectedMovie=lb1.SelectedItem作为电影;
if(selectedMovie==null)返回;
如果(selectedMovie.Name==“(新建)”)
{
var newMovie=新电影{Name=“Untitled”};
_movies.Insert(_movies.Count-1,newMovie);
lb1.SelectedItem=newMovie;
e、 已处理=正确;
}
}
话虽如此,我认为这不是正确的方法。我认为您最好更改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>


下面是一个工作代码示例:

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;
    }
}
public主窗口()
{
初始化组件();
_电影=新的可观察集合(
新[]
{
新电影{Name=“Foo”},
新电影{Name=“Bar”},
新电影{Name=“(new)”},
});
lb1.ItemsSource=\u电影;
}
可观察收集电影;
私有void SelectMovie(对象发送者,SelectionChangedEventArgs e)
{
var selectedMovie=lb1.SelectedItem作为电影;
if(selectedMovie==null)返回;
如果(selectedMovie.Name==“(新建)”)
{
var newMovie=新电影{Name=“Untitled”};
_movies.Insert(_movies.Count-1,newMovie);
lb1.SelectedItem=newMovie;
e、 已处理=正确;
}
}
话虽如此,我认为这不是正确的方法。我认为您最好更改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>


你的问题是什么?你的代码不工作吗?这是一种不会导致错误的方法。我遇到一个错误,指出在迭代数组时无法向数组中添加内容。我的公司。这有VS现在有问题,所以我只是用我记得发生的事情打了这个。我现在想不出别的了,所有的想法都很好你的问题是什么?你的代码不工作吗?这是一种不会导致错误的方法。我遇到一个错误,指出在迭代数组时无法向数组中添加内容。我的公司。这有VS现在有问题,所以我只是用我记得发生的事情打了这个。我现在想不出其他的了,所有的想法都是非常有用的建议,谢谢!非常有用的建议,谢谢!