Я реализую объект модели представления приложения (AVM). Все, что должно быть открыто для представлений приложения в глобальном масштабе, реализуется как свойство в модели представления приложения, чтобы я мог получить к нему доступ через привязку. Это обеспечивает хороший согласованный метод доступа, обеспечивает тестируемость, реализует уведомления об изменении свойств, дает мне место для размещения команд всего приложения, всего того, что вы ожидаете от использования модели представления.
Контекст данных для каждого окна верхнего уровня устанавливается на экземпляр модели представления приложения. Поэтому мне не нужно возиться со словарем ресурсов или запоминать значения ключей вообще. Поначалу это может показаться немного странным - почему два окна используют одну и ту же модель вида? - но если вы хотите поместить одну и ту же команду File/Exit
в каждое окно, которое запускает приложение, это на самом деле имеет логический смысл. В таком случае контекст данных окна устанавливается на AVM, и затем он содержит панель, контекст данных которой установлен на свойство на AVM, которое является фактическим контекстом для этого окна. Пока вы называете свой элемент окна именем, привязка к объектам в AVM тривиальна - {Binding ElementName=TheWindow, Path=DataContext.TheProperty}
- или вы можете представить AVM как свойство моделей дочерних представлений.
Шаблон AVM подвержен тем же подводным камням, что и любой шаблон «один объект для правила» - например, создание дрожащего зверя с 200 несвязанными свойствами. Решение то же самое: объединить эти свойства в классы обслуживания.
Я обычно не помещает в словарь ресурсов ничего, что не создается в XAML. Я могу придумать множество действительных исключений из этого общего правила, но они еще не встречались в моих программах.