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

本文关键字:一个 xaml app 添加 ViewModel 资源 | 更新日期: 2023-09-27 18:16:56

我得到了一个全局属性,我希望能够从我的解决方案的多个地方访问。我有一个类似这样的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,以便能够从多个地方访问这个视图模型的属性,而不必通过它所有的方式。

<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资源的属性?谢谢大家的帮助。

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

看看MVVM灯

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

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

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

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

现在我想知道是否有可能添加到我的app.xaml一个ResourceDictionary,以便能够从多个地方访问这个视图模型的属性,而不必通过它所有的方式。

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

因此,最好避免——我同意@Sheridan的观点,您应该根据需要公开每个视图模型中的各种设置。然后从视图模型中引用设置。你可以通过使用全局/静态来做到这一点,尽管你会冒一些同样的风险;我建议在需要访问的视图模型中注入一个设置包装器类。这可能会在前期多做一些工作,但从长远来看,希望能节省一些麻烦。