我将 DataContract 与 ObservableCollection 结合使用:
[DataContract(Namespace = Terms.MyNamespace)]
public class MyContract
{
internal MyContract ()
{
List = new ObservableCollection<string>();
}
[DataMember]
private ObservableCollection<string> list;
[XmlArray("list")]
public ObservableCollection<string> List
{
get
{
return list;
}
set
{
list = value;
list.CollectionChanged += (s, e) =>
{
Console.WriteLine("It is never happens!! Why?");
};
}
}
...
所以,当我像这样处理我的收藏时。
MyContract contract = new MyContract();
contract.List.Add("some");
已添加项目,但未触发 CollectionChanged 事件。
为什么?
最佳答案
那是因为你在序列化list
时没有序列化List
。因此,在反序列化期间,它不会调用列表的setter,因此不会订阅事件。在您的情况下,您可以简单地用 DataMemberAttribute
标记 List
而不是 list
,例如:
[DataContract]
public class MyContract
{
private ObservableCollection<string> list;
internal MyContract()
{
List = new ObservableCollection<string>();
}
[DataMember]
public ObservableCollection<string> List
{
get
{
return list;
}
private set
{
list = value;
list.CollectionChanged +=
(s, e) =>
Console.WriteLine("It is never happens!! Why? - Are you sure?!");
}
}
}
用法:
var obj = new MyContract();
var serializer = new DataContractSerializer(typeof(MyContract));
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
var result = serializer.ReadObject(ms) as MyContract;
result.List.Add("a");
}
在这种情况下,事件将触发。
关于c# - 作为 WCF 数据契约的 ObservableCollection 和 CollectionChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612633/