Событие отписаться / повторно подписаться на изменение собственности - PullRequest
1 голос
/ 25 августа 2011

Я часто пишу такой код:

MyObject property;
MyObject Property
{
    get { return property; }
    set {
            if (property != null)
                property.Changed -= property_Changed; // unsubscribe from the old value
            property = value;
            property.Changed += property_Changed; // subscribe to the new value
        }
}

Я ищу элегантный способ сделать автоматическую отмену подписки.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Может быть что-то вроде этого, если вам действительно нужно отписаться / подписаться на каждое изменение свойства:

MyObject Property
{
    get { return property; }
    set {
            //unsubscribe always, if it's not null 
            if(property !=null)
               property.Changed -= property_Changed;

            //assign value 
            property = value;

            //subscribe again, if it's not null
            if (property != null)                            
                property.Changed += property_Changed; 

        }
}
2 голосов
/ 25 августа 2011

Это настолько элегантно, насколько вы можете понять с идеей, которую вы пытаетесь реализовать.Конечно, у вас есть логическая ошибка в том, что value может быть нулевым при передаче, и, таким образом, property.Changed += property_Changed может взорваться.

Обычно, если вы назначаете новый объект, вы хотите отписаться от события старого элемента и присоединить его к событию новых элементов.

1 голос
/ 25 августа 2011

Возможно, вам понадобятся методы расширений.

Вы можете попробовать что-то вроде этого.

private MyProperty property;
public MyProperty Property
{
    get { return property; }
    set { property.SubPubValue(value, property_Changed); }
}

private static void property_Changed(object sender, PropertyChangedEventArgs e)
{
    throw new NotImplementedException();
}

public static class Extensions
{
    public static void SubPubValue<T>(this T value, T setValue, PropertyChangedEventHandler property_Changed) where T : MyProperty
    {
        if (setValue != null)
            value.PropertyChanged -= property_Changed;
        value = setValue;
        if (setValue != null)
            value.PropertyChanged += property_Changed;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...