2013-03-07 2 views
1

Как видно из названия, я ищу способ получить элемент, который произвел событие.Outlook Add In get Item after Property_Change Событие

I Bind Property_Change Событие в событии Application_ItemLoad, в котором у меня есть объект Предмет, который, кажется, я не могу использовать.

После того, как объект Property_Change уволен, мне нужен элемент, который активировал событие, чтобы вызвать мою функцию. Есть ли способ получить это? (Я знаю, что могу получить текущий открытый элемент через ActiveExplorer, но если элементы изменены в основном окне, я получаю null).

Код: ThisAddIn.cs

private Explorer _Explorer; 
private List<WrapperItem> list = new List<WrapperItem>; 

private void ThisAddIn_Startup(object sender, System.EventArgs e){ 
    _Explorer = this.Application.ActiveExplorer(); 
    _Explorer.SelectioNChange += _Explorer_SelectionChange; 
} 

void _Explorer_SelectionChange() 
{ 
    list.Clear(); 
    foreach (MailItem mail in _Explorer.Selection) 
    { 
     list.Add(new WrapperItem(mail)); 
    } 
} 

ответ

1

Вы устанавливаете раковина событий на конкретный пункт, не так ли? Какой у вас код?

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

Образец обертка (от верхней части головы) может выглядеть как-то

public class MailItemWrapper 
{ 
    public MailItem item; 
    public MailItemWrapper(MailItem OutlookItem) 
    { 
    item = OutlookItem; 
    item.PropertyChange += new System.EventHandler(PropertyChangeHandler); 
    } 
    private PropertyChangeHandler(string Name) 
    { 
    MessageBox.Show(string.Format("Property named {0} changed on item {1}", name, item.Subject)) 
    } 
} 
+0

звучит разумно, не могли бы вы предоставить пример или ссылку о том, как использовать класс-оболочку, в этом конкретном инциденте? (Im привязывает их в настоящее время к папкам.items.propertchange – Florian

+1

Несомненно, посмотрите на обновленный примерный код выше –

+1

Кроме того, никогда не устанавливайте приемники событий на все элементы в папке - вы убьете свою систему. Или используйте события MAPIFolder.Items или только настройте приемники событий на элементы в коллекции Application.ActiveExplorer.Selection. Очистите старые элементы, когда событие Explorer.SelectionChange запускается и добавляет элементы в Explorer.Selection в список элементов, которые вы отслеживаете. –