Лучшие практики использования ресурсов 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;
Другие вопросы по тегам