如何创建可在应用程序中的任何位置设置/获取的应用程序范围变量? (WPF / MVVM)

时间:2017-06-29 05:44:02

标签: c# wpf variables mvvm singleton

我正在编写WPF应用程序并尝试学习有效的MVVM实践。我的界面中有MenuItem按钮(在MainWindow.xaml中),并希望将他们的Command属性绑定到我创建的ICommand。

当应用程序启动时,我想要将bool(可以从应用程序中的任何位置设置/获取)设置为最初设置为false。当"文件>新" MenuItem被激活,我希望命令触发并检查其" CanExecute"中的应用程序范围变量。方法,然后应该启用或禁用MenuItem。

我的问题是我无法确定哪个最佳位置存储/实例化/ etc这个变量(或属性?)。

我尝试过多种不同的组合,包括使用我的"工作区"实现单例模式设计。 class(包含布尔变量),我现在正在修改静态类和变量。

我的代码显示在这里:

XAML:

<MenuItem Header="_File">
            <MenuItem Header="_New Project" Command="{Binding NewProjectCommand, Source={StaticResource project}}"/>
            <MenuItem Header="_Open Project"/>
</MenuItem>

App.xaml.cs:

public WorkspaceViewModel WorkspaceInfo { get; set; }

public partial class App : Application
{
    public App()
    {
        //Store variable here? How? And what is the best way to expose it to my Commands?
    }

}

WorkspaceViewModel.cs:

class WorkspaceViewModel : Workspace
{

}

NewProjectCommand.cs:

class NewProjectCommand : ICommand
{

    public NewProjectCommand(ProjectViewModel projectViewModel)
    {
    }

    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        //Do an evaluation here using the new bool in App.xaml.cs
        //return true/false, based on the evaluation

    }

    public void Execute(object parameter)
    {
        //Perform steps here to switch the bool in App.xaml.cs, and perform other command functionality
    }
}

Workspace.cs:

class Workspace : INotifyPropertyChanged
{
    private bool _isProjectOpen;

    public bool IsProjectOpen
    {
        get { return _isProjectOpen; }
        set
        {
            _isProjectOpen = value;
            OnPropertyChanged();
        }
    }


    #region INotifyPropertyChanged members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}

我基本上想在我的应用程序的最高级别存储一个true / false值,这样我就可以在&#34; CanExecute&#34;中获取变量。并在&#34;执行&#34;中设置变量。我的所有ICommands的方法,所以我的所有MenuItem将在适当的时候启用和禁用。

我意识到这是一个相当冗长的问题,但我非常感谢任何帮助,如果我需要发布任何其他信息,我很乐意这样做!

提前谢谢大家!

3 个答案:

答案 0 :(得分:4)

“应用程序范围变量”可以在App类中声明为属性:

public partial class App : Application
{
    public bool YourProperty { get; set; } // is false by default
}

现在可以通过

在应用程序的任何地方设置/获取属性“
((App)Application.Current).YourProperty = true;

var propertyValue = ((App)Application.Current).YourProperty;

答案 1 :(得分:3)

将值存储在静态Properties实例的Application.Current字典中:

Application.Current.Properties["NameOfProperty"] = false;
var myProperty = (bool)Application.Current.Properties["NameOfProperty"];

答案 2 :(得分:1)

两种方式
1.。将它们另存为项目设置     右键单击项目,然后单击属性,然后转到设置
    在此处创建您的设置 enter image description here     你可以访问或操纵它们     以编程方式编写代码

Properties.Settings.Default.SavedInputString

2.。将它们存储在自定义xml文件中     Xml文件易于创建,读取和更新,并且是一种快速加载方式     在运行时设置