在app.xaml中添加ViewModel作为资源是一个好习惯吗?

时间:2014-08-07 06:50:42

标签: c# wpf xaml mvvm

我有一个全局属性,我希望能够从我的解决方案的多个位置访问。我有一个类似这样的ViewModel:

    public class GlobalSettingsViewModel : ViewModelBase
    {
    /// Bool is true if simple mode is activated        
    private bool isSimpleModeActive;

    /// <summary>
    /// Gets the IsSimpleModeActive property
    /// </summary>
    public bool IsSimpleModeActive
    {
        get
        {
            return isSimpleModeActive;
        }
        set
        {
            if (isSimpleModeActive == value) { return; }
            isSimpleModeActive = value;
            RaisePropertyChanged("IsSimpleModeActive");
        }
    }   

现在我想知道是否可以向我的app.xaml添加一个ResourceDictionary,以便能够从多个地方访问此viewmodel的属性,而不必一直通过它。

<Application x:Class="AcpCommander.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary... />
</Application.Resources>

然后我如何将该属性绑定到我的视图?现在我有一个像这样的bool绑定的复选框:

<CheckBox Grid.Row="0"
                              Content="Activate simple mode"                                 
                              IsChecked="{Binding IsSimpleModeActive}" /> 

如何绑定app.xaml资源的属性? 感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

看看MVVM灯。

app.xaml中,它声明了ViewModelLocator类型的资源。此对象公开属性以全局方式访问各种ViewModel。因为它是一个资源,你可以从xaml文件绑定它。

<Grid DataContext={Binding Path=MyViewModel, Source={StaticResource ViewModelLocator}}
      ...more here...>

它也会使用依赖注入,但这是可选的,你不必担心它,如果你不知道它是什么(但我强烈建议你去了解它)。

实际上,使用资源公开虚拟机没有问题。

答案 1 :(得分:0)

  

现在我想知道是否可以向我的app.xaml添加一个ResourceDictionary,以便能够从多个地方访问此viewmodel的属性,而不必一直通过它。

你可以这样做,除非你真的知道自己在做什么,否则这通常是一个坏主意。 (绑定到它的方式是使用Source=StaticResource,如IsChecked="{Binding Source={StaticResource GlobalSettingsViewModel},Path=IsSimpleModeActive}" />中所示。)这与全局变量相关的问题相同 - 您可以很快失去对引用的其他对象的范围和生命周期的控制全局的;你失去了封装;你很容易引入内存泄漏。

所以,最好避免 - 我同意@Sheridan,你应该根据需要公开每个视图模型中的各种设置。然后从视图模型中引用设置。你可以通过使用全局/静态来实现这一点,尽管你会遇到一些相同的风险;我建议将一个设置包装类注入需要访问的视图模型中。这可能会提前做一些工作,但从长远来看,希望可以省去一些麻烦。

相关问题