Это - просто часть ужасающей путаницы, которая является API даты/времени Java. Список что случилось с ним занял бы очень долгое время (и я уверен, что не знаю половины проблем). По общему признанию рабочий с датами и временем хитро, но aaargh так или иначе.
Делают себе одолжение и используют Время Joda вместо этого, или возможно JSR-310.
РЕДАКТИРОВАНИЕ: Что касается причин, почему - как отмечено в других ответах, это могло произойти из-за старых API C, или просто общего настроения запуска всего от 0... за исключением того, что дни запускаются с 1, конечно. Я сомневаюсь, мог ли кто-либо вне исходной команды внедрения действительно заявить причины - но снова, я буду убеждать читателей не волноваться так [приблизительно 117], почему плохие решения были приняты, чтобы посмотреть на целую палитру злобности в java.util.Calendar
и найти что-то лучше.
Одна точка, которая является в пользу использования индексов на основе 0, - то, что оно делает вещи как "массивы имен" легче:
// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];
, Конечно, это перестало работать, как только Вы получаете календарь с 13 месяцами..., но по крайней мере определенный размер является числом месяцев, которые Вы ожидаете.
Это не хорошо причина, но это причина...
РЕДАКТИРОВАНИЕ: Как вид комментария запросов некоторые идеи о том, что я думаю, являются неправильными с Датой/Календарем:
Date
и Calendar
как разные вещи, но разделение "локальных" по сравнению с "зонными" значениями отсутствует, как дата/время по сравнению с датой по сравнению со временем Date.toString()
реализация, которая всегда использует системную зону местного времени (это смутило многих пользователей Переполнения стека до настоящего времени) Вы можете использовать событие TreeViewItem.Expanded
в качестве присоединенного события:
<TreeView TreeViewItem.Expanded="TreeViewItem_Expanded"
ItemsSource="{Binding}">
...
</TreeView/>
В коде программной части вы можете идентифицировать TreeViewItem
, который инициировал событие, использующее свойство OriginalSource
:
private void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem tvi = e.OriginalSource as TreeViewItem;
if (tvi != null)
{
MessageBox.Show(string.Format("TreeNode '{0}' was expanded", tvi.Header));
}
}