C# ListView未使用绑定列表更新

C# ListView未使用绑定列表更新,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在尝试实现一个简单的应用程序:我的ViewModel中有一个对象列表,我想用Datatemplate显示在ListView中。在我添加一个在列表中添加元素的按钮之前,绑定的一切都很好。当我这样做时,ListView不会更新。但是,如果我尝试向下滚动列表,整个程序将停止,并显示以下消息: “应用程序处于中断模式,您的应用程序已进入中断状态, 但是没有代码显示,因为所有线程都在执行 外部代码(通常为系统或框架代码)。” 下面是代码: 模型类: namespace WpfTest { cl

我正在尝试实现一个简单的应用程序:我的ViewModel中有一个对象列表,我想用Datatemplate显示在ListView中。在我添加一个在列表中添加元素的按钮之前,绑定的一切都很好。当我这样做时,ListView不会更新。但是,如果我尝试向下滚动列表,整个程序将停止,并显示以下消息:

“应用程序处于中断模式,您的应用程序已进入中断状态, 但是没有代码显示,因为所有线程都在执行 外部代码(通常为系统或框架代码)。”

下面是代码:
模型类:

namespace WpfTest
{
    class Model
    {
        public string Value1 { get; set; }
        public int Value2 { get; set; }
        public bool Value3 { get; set; }

        public Model()
        {
            Value1 = "abc";
            Value2 = 3;
            Value3 = true;
        }
    }
}
ViewModel类:

namespace WpfTest
{
    class ViewModel : INotifyPropertyChanged
    {
        public List<Model> _model;
        private ICommand _addElement;

        public ViewModel()
        {
            _addElement = new RelayCommand(Add);
            _model = new List<Model>()
            {
                new Model(),
                new Model()
            };
        }

        public List<Model> ModelList
        {
            get => _model;
            set => _model = value;
        }

        public ICommand AddElement
        {
            get => _addElement;
            set => _addElement = value;
        }

        public void Add(object o)
        {
            _model.Add(new Model());
            OnPropertyChanged("ModelList");
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string message)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(message));
            }
        }
    }
}
名称空间WpfTest
{
类ViewModel:INotifyPropertyChanged
{
公共列表模型;
专用ICommand _addElement;
公共视图模型()
{
_ADDELENT=新的继电器命令(Add);
_模型=新列表()
{
新模型(),
新型号()
};
}
公共列表模型列表
{
get=>\u模型;
set=>_model=值;
}
公共ICommand加法
{
get=>\u addElement;
set=>_addElement=值;
}
公共无效添加(对象o)
{
_model.Add(新模型());
OnPropertyChanged(“模型列表”);
}
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串消息)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(消息));
}
}
}
}
XAML视图:

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        xmlns:Mod="clr-namespace:WpfTest" 
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type Mod:Model}">
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Value1}"></Label>
                <Label Content="{Binding Value2}"></Label>
                <Label Content="{Binding Value3}"></Label>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <Button Command="{Binding AddElement}">Add</Button>
        <ListView ItemsSource="{Binding ModelList}"></ListView>
    </StackPanel>
</Window>

添加
我使用的是Visual Studio Community 2017的最新版本

提前感谢您的帮助

列表
替换为
可观察收集
。当列表的内容更改时,它将正确地通知任何绑定的UI元素

如果希望在UI中发布对单个模型对象的更新,则模型类必须实现
INotifyPropertyChanged
,并相应更新属性定义。

列表
替换为
ObservableCollection
。当列表的内容更改时,它将正确地通知任何绑定的UI元素

如果希望在UI中发布对单个模型对象的更新,则模型类必须实现
INotifyPropertyChanged
,并相应更新特性定义