Лучшие практики использования ресурсов WPF, MVVM и приложений
В настоящее время я пишу приложение WPF, в левой части которого расположена панель навигации (к которой я привязываю навигационную модель), а справа - средство представления контента (которое я привязываю к ранее упомянутому элементу UserControl виртуальной машины 'CurrentView'. Для каждого элемента этой навигационной панели я создал соответствующий пользовательский элемент управления, и для каждого из этих пользовательских элементов управления я связал экземпляр соответствующей ViewModel.
При щелчке по элементам панели навигации его член UserControl CurrentModel CurrentView устанавливается на экземпляр соответствующего UC, который затем отображается в представителе содержимого, упомянутом выше.
Первый элемент навигации - это форма "выбрать или создать нового клиента". Когда эта операция будет завершена, я хотел бы установить некоторый широкий идентификатор ресурса приложения, к которому я бы привязал другие элементы навигации Включено. Таким образом, если ресурс широкого приложения равен нулю, они отключаются, как только он устанавливается на что-либо, они включаются. Также был бы некоторый механизм, который позволил бы соответствующему ViewModel быть уведомленным об этой ситуации.
Мне интересно, если это будет считаться хорошей практикой? Кроме того, я хотел бы знать, могу ли я просто объявить ресурс int в файле app.xaml и связать его со свойством элементов навигации Enabled, установит ли этот ресурс что-либо, что немедленно обновит это свойство? Или есть способ получше, проще или чище?
2 ответа
Альтернативой может быть вложение двух моделей представления (навигация и текущее представление) в третью модель представления (скажем, mainviewmodel)
Эта основная модель представления может затем сохранять состояние, которое должно быть доступно для этих моделей представления и для экземпляров текущих представлений.
Таким образом, вам не нужно иметь глобальное состояние в приложении, и вы можете просто установить текст данных окна в основную модель представления и связать представления навигации и содержимого со свойствами основной модели представления.
Это также позволяет вам иметь подходящее место для перехода к другому представлению содержимого.
Вот что я в итоге сделал:
В моем app.xaml; Я объявляю следующий ресурс:
<Application x:Class="MyProject.GUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MyProject.GUI.ViewModels"
StartupUri="MainWindow.xaml">
<Application.Resources>
<vm:MainViewModel x:Key="MainViewModel" />
</Application.Resources>
</Application>
Этот MainViewModel предоставляет статическое свойство следующим образом:
static bool _myStaticProperty;
public static bool MyStaticProperty
{
get
{
return _myStaticProperty;
}
set
{
_myStaticProperty = value;
NotifyStaticPropertyChanged("MyStaticProperty");
}
}
И следующий статический механизм INPC:
#region Static property INPC mechanism
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
static void NotifyStaticPropertyChanged(string propertyName)
{
if (StaticPropertyChanged != null)
{
StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
И мои разные viewmodels:
FirstChildViewModel _firstChildViewModel;
public FirstChildViewModel FirstChildViewModel
{
get
{
if (_firstChildViewModel == null)
_firstChildViewModel = new FirstChildViewModel();
return _firstChildViewModel;
}
}
//then a second one, a third one and so on
Которые привязаны к моим пользовательским элементам управления следующим образом
<UserControl x:Class="MyProject.GUI.Views.FirstChildControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyProject.GUI.ViewModels"
mc:Ignorable="d"
DataContext="{Binding Path=FirstChildViewModel,
Source={StaticResource MainViewModel}}">
В коде xaml моих пользовательских элементов управления я объявляю привязки команд и т. Д., Которые в основном делают следующее в своей ViewModel
MainViewModel.MyStaticProperty = myBoolValue;