簡體   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