C# ListView未更新itemsource ObservableCollection项属性更改

C# ListView未更新itemsource ObservableCollection项属性更改,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,考虑以下示例代码: View.xml <Grid> <ListView Name="NameList" HorizontalAlignment="Left" Height="142" Margin="55,45,0,0" VerticalAlignment="Top" Width="389"> <ListView.ItemTemplate> <DataTemplate>

考虑以下示例代码:

View.xml

<Grid>
    <ListView Name="NameList" HorizontalAlignment="Left" Height="142" Margin="55,45,0,0" VerticalAlignment="Top" Width="389">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Label Content="{Binding FirstName}"/>
                    <Label Content="{Binding LastName}" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="Button" HorizontalAlignment="Left" Margin="120,256,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>

</Grid>
ViewModel.cs

class ViewModel : INotifyPropertyChanged
{

    public ViewModel()
    {
        fn = new ObservableCollection<fullname>();
        fn.CollectionChanged += ContentCollectionChanged;
        fn.Add(new fullname("A", "B"));
        fn.Add(new fullname("C", "D"));
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (fullname item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= EntityViewModelPropertyChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (fullname item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += EntityViewModelPropertyChanged;
            }
        }
    }

    public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //This will get called when the property of an object inside the collection changes
    }

    public ObservableCollection<fullname> _fn;
    public ObservableCollection<fullname> fn
    {
        get { return _fn; }
        set { _fn = value; OnPropertyChanged("fn"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {

        }
    }
}
如果我在ObservableCollection中添加或删除任何项,它会正确更新视图中的ListView,但问题是如果我修改ObservableCollection项属性,ListView不会更新

例如: 单击上面指定的按钮,它将被激活
A.添加新项目(成功反映在ListView中)
B修改第一个项目的FirstName(未反映在ListView中)

我应该怎样做才能使修改反映在视图中


如果有人能指出我做错了什么,我将不胜感激。

只有在添加、删除或移动项目时,更改项目时才会触发ObservableCollection事件。 必须在item类中实现INotifyPropertyChanged接口,并在集合中注册每个item事件

如果在集合中进行重大更改,则可以引发

NotifyCollectionChangedAction.Reset

事件来重置它们


请参见

是简化的代码版本,还是您真的没有在
OnPropertyChanged
方法中引发
INPC.PropertyChanged
事件?获取处理程序,但不引发事件:
handler(这是新的PropertyChangedEventArgs(name))我已经阅读了该链接,并且已经实现了类似的功能,但是没有成功,并且再次进行了检查。调试时发现它未输入EntityViewModelPropertyChanged()。我应该发布代码吗?确保item.PropertyChanged+=EntityViewModelPropertyChanged;为每个项目调用。你可以发布你的代码。发布代码。item.PropertyChanged+=EntityViewModelPropertyChanged是为ObservableCollection中的每个全名项调用的。但在进行更改时,控件不会转到EntityViewModelPropertyChanged。这是您的真实代码吗?你看到dkozl的评论了吗?这太尴尬了。没有引发事件。真的很抱歉浪费了你的时间。也非常感谢@dkozl
class ViewModel : INotifyPropertyChanged
{

    public ViewModel()
    {
        fn = new ObservableCollection<fullname>();
        fn.CollectionChanged += ContentCollectionChanged;
        fn.Add(new fullname("A", "B"));
        fn.Add(new fullname("C", "D"));
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (fullname item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= EntityViewModelPropertyChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (fullname item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += EntityViewModelPropertyChanged;
            }
        }
    }

    public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //This will get called when the property of an object inside the collection changes
    }

    public ObservableCollection<fullname> _fn;
    public ObservableCollection<fullname> fn
    {
        get { return _fn; }
        set { _fn = value; OnPropertyChanged("fn"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {

        }
    }
}
class fullname : INotifyPropertyChanged
{
    public fullname(string f, string l)
    {
        FirstName = f;
        LastName = l;
    }

    public string _FirstName;
    public string FirstName
    {
        get { return _FirstName; }
        set { _FirstName = value; OnPropertyChanged("FirstName"); }
    }


    public string _LastName;
    public string LastName
    {
        get { return _LastName; }
        set { _LastName = value; OnPropertyChanged("LastName"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {

        }
    }
}