[英]get value of a property from one viewmodel's current instance in another
我有一个类似下面的设置:
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中),很难理解这些模式。 我还可以采用其他解决方案吗?
我也看了这个问题的公认答案。 我已经尝试过那里给出的代码,但是在Page1ViewModel或Page2ViewModel中没有获得价值。
更新---> @Poke
抱歉,我没有提到这个问题。
我的菜单中还有另一个项目Item3。 当我单击它时,Page1应该可见。
所以,现在我的设置是:
MenuItem | Page | ViewModel
-----------+---------------+-------------
Item1 | Page1 | Page1ViewModel
Item2 | Page2 | Page2ViewModel
Item3 | Page1 | Page1ViewModel
Item1 Click和Item3 Click之间的唯一区别是:
单击Item1时:
名为cbEffects的组合框应该可见。
单击Item1时:
名为cbEffects的组合框应被隐藏。
这是一个通过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;
}
}
不确定这是否是您要查找的内容,但是您可以通过App.Current.MainWindow.DataContext属性访问应用程序viewmodel,并将通用属性存储在其中。或者,我要做的是,存储可用于所有视图的变量在静态类中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.