Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Одной вещью, на которую я посмотрел бы, является шаблон модели образцового представления представления. Это - очень изящный шаблон, который естественно разделяет все на хорошие блоки... включая Ваш xaml.
, Например, это помогает Вам сохранить ясную границу между разработчиком и разработчиком и даже допускает разработку через тестирование.
существует целый набор информации там о нем, но я запустил бы с сообщений в блоге John Gossman:
Обновление: Просто хочу указать на людей на другое сообщение StackOverflow с большим количеством хорошей информации о M-V-VM в нем.
Одна подсказка не должна объявлять обработчики событий в XAML. Вместо этого назовите свои элементы и присоедините обработчики событий в коде - позади. Это помогает сохранить чистое разделение между разработчиком и разработчиком.
Другая подсказка должна разделить XAML в функциональный и эстетическое. Разработчики обычно работали бы в функциональном XAML, пока разработчики заботятся, прежде всего, об эстетическом. Это сохраняет функциональное очень легкое XAML к grok, который важен, потому что разработчики часто должны редактировать такой XAML. Эстетический XAML обычно редактируется инструментами использования разработчиков, таким образом, его опрятность и многословие являются меньшим количеством проблемы.
я сделал что-то вроде сообщения в блоге на этом только что здесь .
Когда Вы будете следовать за надлежащим шаблоном как Mode-View-ViewModel, Вы получите возможность сделать больше на стороне XAML и меньше на коде позади. Максимизируйте использование RoutedEvents и Команды в коде WPF.
При создании UserControls я пробую к Xamlize как можно больше.
Одна подсказка, которую я нашел в поле, - то, что создание ControlTemplate
и DataTemplates
вручную является действительно болью в ***... Я всегда пишу тем в XAML....
As others have suggested, try following the Model-View-ViewModel pattern. However, it's OK to put stuff in the codebehind! The rule is that if it's "View" related, you put it in the Xaml or the codebehind (whichever is more convenient for you). If it's more business logic related to how the user interacts with the system, then it belongs in the ViewModel. If it's just business logic not concerned with interaction, it belongs in the Model.
Examples of each would be:
Model: defines a property called ModifiedDate that stores the last time it was modified.
ViewModel: converts the ModifiedDate into an enumeration property called ModifiedAge, based on when it was modified: Yesterday, In the Last Week, In the Last Month, In the Last Year, etc.
View: converts the ModifiedAge property to a background color where more recently accessed data is highlighted bright yellow, and less recently accessed data is more of a beige-khaki-gray that your designer insists is called "Meadow Lark Lilly Flowerpot".
Я бы сказал, используйте как можно больше xaml, используя Binding
, commands
, styles
, templates
и т.д. Мне нужно было поддержать функциональность сохранения и загрузки шаблонов с помощью XAMLReader/XAMLWriter, и это проще для элементов управления, имеющих больше xaml.
Не упускайте из виду тот факт, что XAML - это код . Он декларативный и все такое, но все же язык программирования. Фактически, он проходит преобразование в C # или Visual Basic, прежде чем превращается в IL для компилятора .NET.
Я повторю комментарий Скотта Уитлока: MVVM - отличный способ разделить проблемы и сосредоточиться на архитектурных деталях. Это действительно нормально - вставлять что-то в свой код программной части, особенно то, что он описывает. Если у вас нет требования отделять дизайнера от разработчика, адаптируйте шаблон MVVM к вашим конкретным потребностям; не пытайтесь заставить себя быть чистым или идеалистичным в этом отношении.
Также совершенно нормально помещать вызовы методов вашей модели ViewModel прямо в код View позади, если вам не нужна гибкость команд с помощью классов ICommand. Или, если вы знаете, что View, который вы создаете, всегда будет привязан к классу ViewModel, который вы создаете. Или вы могли бы пойти дальше, определить интерфейс для вашей ViewModel и привязаться только к реализациям этого интерфейса. Тогда вы все равно можете поменять ViewModel, когда захотите.
Такие вещи.