我正在编写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将在适当的时候启用和禁用。
我意识到这是一个相当冗长的问题,但我非常感谢任何帮助,如果我需要发布任何其他信息,我很乐意这样做!
提前谢谢大家!
答案 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)