События ObservableCollection и CollectionChanged как WCF-данные

Я использую 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 не сработало.

Зачем?

1 ответ

Решение

Это потому, что вы не сериализуете List пока сериализуются list, Таким образом, во время десериализации он не будет вызывать установщик списка, поэтому не будет подписываться на событие. В вашем случае вы можете просто пометить List с DataMemberAttribute вместо 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");
}

В этом случае событие сработает.

Другие вопросы по тегам