GlobalSettings ViewModel - PullRequest
       15

GlobalSettings ViewModel

3 голосов
/ 05 октября 2009

У меня есть некоторые глобальные настройки, которые должны исходить из ViewModel и быть доступными для всех шаблонов данных во всех элементах управления пользователя. Он включает в себя такие вещи, как GlobalButtonMargin, GlobalStrokeWidth или GlobalWorkspaceBackgroundColor. Эти вещи находятся в viewmodel, потому что пользователь может редактировать эти настройки во время выполнения.

Как бы вы реализовали это хорошим способом MVVM?

Я думал о наличии Singleton GlobalSettingsViewModel. Это предпочтительный подход? Если да, то как я могу получить доступ к экземпляру синглтона из XAML?

Другим способом было бы передать GlobalSettings всем экземплярам ViewModel, которые существуют в моем приложении, чтобы я мог получить доступ из моделей представления, для которых я создаю шаблоны данных. Но это кажется нечистым.

Третий подход состоит в том, чтобы полностью отказаться от подхода ViewModel, определить его как ресурсы XAML и динамически устанавливать ресурсы во время выполнения с помощью FindResource.

Не могли бы вы набросать, как бы вы разработали свое приложение для поддержки этого сценария?

Ответы [ 2 ]

4 голосов
/ 10 октября 2009

Вы можете использовать статические данные, с которых вы можете читать и привязывать их, используя x: Static в вашем XAML. Я не люблю делать статические глобальные настройки, так как это скорее анти-шаблон.

Я думаю, вам следует обратить внимание на инверсию управления / внедрения зависимостей. Существует много IoC-контейнеров, но я обычно использую Unity для внедрения зависимостей. Это доступно в http://prism.codeplex.com

Используя IoC, вы можете зарегистрировать свой класс настроек, и в вашей виртуальной машине, которой нужны данные, они могут легко извлечь нужные вам настройки. Ваш код будет выглядеть примерно так (при использовании единицы).

var vm = container.Resolve<SomeViewModel>();

public class SomeViewModel
{
  public SomeViewModel(IUnityContainer container)
  {
      ISomeSettings settings = container.Resolve<ISomeSettings>();    
  }
}

РЕДАКТИРОВАТЬ: Или вот другое решение, которое вы можете искать:

Создайте свой синглтон:

class GlobalSettings : ViewModel
{
    private Thickness m_globalGirth;

    private static GlobalSettings m_instance = new GlobalSettings();

    public GlobalSettings()
    {
        GlobalGirth = new Thickness(2, 2, 2, 2);
    }
    public Thickness GlobalGirth
    {
        get { return m_globalGirth; }
        set
        {
            m_globalGirth = value;
            InvokePropertyChanged("GlobalGirth");
        }
    }

    public static GlobalSettings Instance
    {
        get { return m_instance; }
        set { m_instance = value; }
    }
}

Затем настройте свои привязки:

<Window x:Class="WpfApplication3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication3="clr-namespace:WpfApplication3"
    Title="Window1" Height="300" Width="300" MouseDoubleClick="Window_MouseDoubleClick">
    <Window.Resources>
        <WpfApplication3:GlobalSettings x:Key="settings" />
    </Window.Resources>
    <Grid>
        <Border BorderThickness="{Binding Source={StaticResource settings}, Path=Instance.GlobalGirth}"
                BorderBrush="Black"
                Width="100"
                Height="100" />
    </Grid>
</Window>
3 голосов
/ 12 октября 2009

Я бы создал тип для представления вашей ViewModel как класса, а затем определил бы его экземпляр как ресурс на уровне ApplicationLevel. Это гарантирует один экземпляр для всего приложения, и теперь вы сможете ссылаться на эти настройки с помощью StaticResource. Так, например:

<Application xmlns:myNS="clr-namespace:MyNamespace;assembly=MyAssembly" ...>
    <Application.Resources>
        <myNS:MySettings x:Key="Settings" />
    </Application.Resources>
</Application>

А затем в окнах / средства управления / шаблоны / и т. Д. Вы можете получить доступ к экземпляру MySettings, используя:

{Binding Source={StaticResource Settings}, Path=MyProperty}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...