[英]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.