Это очень старая тема, но она попадает в топ результатов поиска по теме.
Из моих экспериментов с SP2010, похоже, что properties.AfterProperties пусто, когда элемент поступает из корзины, тогда как оно полностью заполнено фактическим новым элементом.
Итак, простой блок, подобный этому, сработает:
if (!properties.AfterProperties.Cast<DictionaryEntry>().Any())
{
// From Recycle Bin!
}
else
{
// This item is really new.
}
Я еще не тестировал MOSS или SP2013.