c# - 作为 WCF 数据契约的 ObservableCollection 和 CollectionChanged 事件

标签 c# .net wcf observablecollection inotifycollectionchanged

我将 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/

相关文章:

asp.net - 如何捕获 ASP.NET 应用程序中未处理的异常?

wcf - 如何使用 Json.Net 从 WCF Rest 服务 (.NET 4) 返回 json,而不是用引号引起来的字符串?

jquery - 如何使用 jquery POST 到 WCF

c# - ViewBag 中的 System.Random 不显示为字符串?

c# - 如何/何时使用 json?

c# - 我在哪里可以找到一些在类里面使用的静态属性与实例 "fieldless"属性的明确示例?

.net - MVC3项目升级到VS2012后出现AccessViolationException

wcf - Visual Studio 2015 + Xamarin + native 可移植 PCL + WCF

c# - 将折线图保存到 SQL 数据库中

c# - 处理来自 asp.net (mvc) 的数千次外部服务调用的正确方法