从另一个viewmodel的当前实例中获取属性的值

时间:2014-03-22 19:09:15

标签: c# wpf mvvm

我的设置如下:

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. 点击第1项时:

    应该可以看到名为cbEffects的Combobox。

  2. 点击第1项时:

    应隐藏名为cbEffects的Combobox。

2 个答案:

答案 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,并在其中存储公共属性..或者,我所做的是存储变量可访问静态类中的所有视图..