如何在设置了ListBox的DataBinding之后向其添加内容

本文关键字:之后 添加 DataBinding 设置 ListBox | 更新日期: 2023-09-27 18:25:56

我正在创建一个windows Phonw 8.1应用程序。我有一个ListBox,我想在运行时单击按钮时附加/插入其他。但它不起作用或崩溃。

我的页面的构造函数我有这个:

myData = new List<Stuff>() {
    new Stuff(){Name="AAA"},
    new Stuff(){Name="BBB"},
    new Stuff(){Name="CCC"},
    new Stuff(){Name="DDD"},
};
myListBox.DataContext = myData;

我的页面的xaml:

<ListBox x:Name="myListBox" ItemsSource="{Binding}" Background="Transparent">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" FontSize="20" Foreground="Red"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

好的,这很好,当我启动应用程序时,我可以看到包含4个项目的列表。

private void Button_Tapped(object sender, TappedRoutedEventArgs e)
{
    myData.Add(new Stuff() { Name = String.Format("Added item #{0}", myData.Count) });
    //I tried to set the DataContext again, but it does nothing
    myListBox.DataContext = mydata;
    //I tried to tell the the list to redraw itself, in winform, the Invalidate() method usually get the job done, so I tried both
    myListBox.InvalidateMeasure()
    //and / or
    myListBox.InvalidateArrange();
    //or
    myListBox.UpdateLayout();
    //I tried
    myListBox.Items.Add("Some text");
    //or
    myListBox.Items.Add(new TextBlock(){Text="Some text"});
    //or 
    (myListBox.ItemsSource as List<Stuff>).Add(new Stuff(){Name="Please work..."});
}

最好的办法就是抛出一个异常:

An exception of type 'System.Exception' occurred in mscorlib.ni.dll but was not handled in user code
Additional information: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

我也使用了ListView,但没有任何变化。额外的问题:ListBox和ListView之间有什么区别?

谷歌并没有真正的帮助,我发现的东西可能是旧版本的WindowsPhone或普通的WPF或ASP.Net…

此外,发生的一件奇怪的事情是,在向列表中添加一个项目后,什么都没发生,当我点击一个旧项目时,我会出现灾难性的失败。我的列表项目中还没有活动。

我即将放弃数据绑定,而只是一段一段地构建我的应用程序。把东西添加到列表中应该没那么难,我做错了什么?

如何在设置了ListBox的DataBinding之后向其添加内容

需要用INotifyPropertyChanged接口实现一些东西,要么自己实现,要么使用内置的类。

MSDN INotifyPropertyChanged接口

尝试

using System.ComponentModel;
using System.Collections.ObjectModel;
public class Stuff
{
    public Stuff(string name)
    {
        this.Name = name;
    }
    public string Name { get; set; }
}

ObservableCollection<Stuff> myData = new ObservableCollection<Stuff>();

myData.Add(new Stuff("abcd"));