Поскольку вы используете известные события из .NET Framework (в отличие от сторонних) и из кода, похоже, что вы используете эти методы только для определенных классов (например, ListBoxItems и ListBoxes), существует несколько вещей, которые вы знаете , чтобы быть правдой:
sender
никогда не будет нулевым
sender
всегда будет ListBoxItem или ListBox, соответственно
Так зачем использовать оператор as
? Просто брось!
Тогда первый фрагмент становится
private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var listBoxItem = (ListBoxItem)sender;
var clickObject = (ClickObject)listBoxItem.DataContext;
clickObject.SingleClick();
}
Обратите внимание, что это не так в общем случае (вы бы этого не делали, если бы обрабатывали все события PreviewMouseDown в этом одном обработчике для всех типов элементов управления), но для такого кода обработки событий, особенно в коде пользовательского интерфейса, вы можете быть абсолютно уверены, что отправитель не будет нулевым, а отправитель будет того типа, которого вы ожидаете.