我的设置如下:
MainWindow ------> MainWindowViewModel
|--Menu
|--Frame
Page1 --------> Page1ViewModel
Page2 --------> Page2ViewModel
假设我的菜单中有2个项目,即Item1和Item2。 Menu的SelectedMenuItem绑定到MainWindowViewModel中名为SelectedItem的属性。 当我点击Item1时,我被导航到Page1,同样当我点击Item2时,我被导航到Page2。
现在,在Page1ViewModel和Page2ViewModel中,我希望拥有SelectedItem的当前值。我怎样才能获得这个价值?
在问这个问题之前,我已经看过Mediator Pattern以及EventAggregator但是对于像我这样的新手(在WPF中),很难理解这些模式。我可以采用其他任何解决方案吗?
此外,我查看了this问题的接受答案。我已经尝试了那里给出的代码但是我没有在Page1ViewModel或Page2ViewModel中获得价值。
更新---> @Poke
对不起,我没有提到这个问题。
我的菜单中有另一个名为Item3的项目。当我点击它时,Page1应该是可见的。
所以,现在我的设置是:
MenuItem | Page | ViewModel
-----------+---------------+-------------
Item1 | Page1 | Page1ViewModel
Item2 | Page2 | Page2ViewModel
Item3 | Page1 | Page1ViewModel
Item1 Click和Item3 Click之间的唯一区别是:
点击第1项时:
应该可以看到名为cbEffects的Combobox。
点击第1项时:
应隐藏名为cbEffects的Combobox。
答案 0 :(得分:1)
以下是通过SessionViewModel.GetModuleInstance('VMName')
在应用程序中的任何位置维护静态属性中的ViewModel实例的一个示例:
namespace MyProject.ViewModels
{
public sealed class SessionViewModel : ViewModelBase
{
private static readonly SessionViewModel instance = new SessionViewModel();
public static SessionViewModel Instance
{
get { return instance; }
}
private List<IModule> modulesOpen;
public List<IModule> ModulesOpen
{
get { return modulesOpen; }
set
{
modulesOpen = value;
NotifyPropertyChanged(() => ModulesOpen);
}
}
}
public static IModule GetModuleInstance(string moduleName)
{
string finalName = "MyProject.ViewModels." + moduleName + "ViewModel";
IModule moduleToOpen = null;
if (Instance.ModulesOpen != null)
{
moduleToOpen = Instance.ModulesOpen.SingleOrDefault(mod => mod.ModuleName == moduleName);
}
else
{
Instance.ModulesOpen = new List<IModule>();
}
if (moduleToOpen != null) return moduleToOpen;
Type module = Type.GetType(finalName);
moduleToOpen = (IModule) Activator.CreateInstance(module);
Instance.ModulesOpen.Add(moduleToOpen);
return moduleToOpen;
}
public class UsageExample()
{
var vm = SessionViewModel.GetModuleInstance("MyVMName");
((MyVMName)vm).MyVMPropertyName;
}
}
答案 1 :(得分:0)
不确定这是否是您正在寻找的,但您可以通过App.Current.MainWindow.DataContext属性访问应用程序viewmodel,并在其中存储公共属性..或者,我所做的是存储变量可访问静态类中的所有视图..