INotifyPropertyChanged不适用于XML序列化

| 我有一个绑定到集合的DataGridView。集合中的类型实现INotifyPropertyChanged(来自MSDN页面的教科书实现)。
public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(string name)
    {
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

public string Name
    {
    get { return m_Name; }
    set { m_Name = value; NotifyPropertyChanged(\"Name\"); }
    }
我试图了解何时,如何以及为何触发PropertyChanged事件。如果我编写代码使用Name属性更改字符串,则一切正常,PropertyChanged为!= NULL,并且DataGridView正确更新。像这样:
for (int i = 0; i < Server.Customers.Count; i++)
    {
    Server.Customers[i].Name = Server.Customers[i].Name + \"!!\";
    }
那只是一个测试,但是,该集合真正更新的方式是通过XML反序列化。序列化器的实现非常简单,并且代码逐步遍历与上一个示例完全相同的Name属性(调用NotifyPropertyChanged)。有一个区别:PropertyChanged原来是NULL,并且从不被调用。结果:我的数据绑定没有更新。 我不太了解这里发生了什么。首先,我从来没有明确地订阅PropertyChanged(我发现的任何代码示例也都没有),但是在第一个示例中却正确地调用了它。在第二个示例中,如何将XML反序列化为对象,如何使它起作用?     
已邀请:
XML序列化无法更新现有对象,反序列化时始终会创建一个新对象。由于它是一个新对象,因此尚未有任何用于
PropertyChanged
的处理程序,因此不会触发该事件。 监听正在创建的对象的“ 2”事件没有任何意义。您到底想做什么?     
我完全同意托马斯的回答并添加一些建议: 如果需要使用
INotifyPropertyChanges
,则绝对应该采用其他方法反序列化对象。您可以使用实例方法如
InitializeFrom(string xml)
UpdateFrom(string xml)
。创建一个对象,订阅subscribe2ѭ事件,然后在现有对象上调用
UpdateFrom(xml)
。因此,您将收到有关更改的通知,并使现有对象保持活动状态。在这里,您可以通过以下方式实现整个过程:
class MyClass : INotifyPropertyChanges
{
    private void NotifyPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public string Name
    {
        get { return m_Name; }
        set { m_Name = value; NotifyPropertyChanged(\"Name\"); }
    }

    public void UpdateFrom(string xml)
    {
        MyClass deserialized = Deserialize(xml);

        // here you set all properties you have
        Name = deserialized.Name;
        // and all the rest properties...
    }

    private static MyClass Deserialize(string xml)
    {
        XmlSerializer ser = new XmlSerializer(typeof(MyClass));
        using (StringReader reader = new StringReader(xml))
        {
            return (MyClass)ser.Deserialize(reader);
        }
    }
}
我还要修改
NotifyPropertyChanged
方法,以便在属性值未更改时不会触发。     
我这里有一个类似的问题,因为我真的不想单独更新每个属性,所以我设法通过执行DataContext =(Settings)bf.Deserialize(oS)来解决它。其中Settings是我的modelview,它执行propertyChanged内容,bf是我的xmlserializer,而OS是我的文件流。     

要回复问题请先登录注册