繁体   English   中英

从一个视图模型的当前实例的另一个实例中获取属性的值

[英]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之间的唯一区别是:

  1. 单击Item1时:

    名为cbEffects的组合框应该可见。

  2. 单击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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM