它可能是转储主题,但我不知道如何总结这个问题。
首先,我是MVVM和MVVMLight的新手。
我尝试创建特定视图模型的多个实例(例如GalleryViewModel),并在相应视图中显示相应数据,并绑定到GalleryViewModel的特定实例。因此,用户打开(例如)五个GalleryView,而在后台,每个GalleryView必须绑定到相应的GalleryViewModel。
因此,我打电话给#34; GetInstance"使用GUID作为InstanceKey的SimpleIoC。
问题是,这样,当视图模型中的数据发生更改时,视图不会更新。我发现,当我用实例键实例化viewmodel时,情况就是这样。
所以我认为,我必须使用instancekey XY将当前视图链接/绑定到该viewmodel。但我不知道该怎么做。
My" architecture"是这样的:MainViewModel调用GetInstance(GUID)-Method。在MainView中,使用GalleryView显示/创建新的UserControl。它的datacontext通过XAML绑定到GalleryViewModel(但这可能是问题所在,因为这个绑定不能知道GUID,因此可能绑定到错误的实例(?)并且DataBindings不会更新
以下是一些代码:
ViewModelLocator只返回一个实例(可能是问题)
public GalleryMainViewModel Gallery
{
get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); }
}
在MainViewModel中,&#34;导航&#34;被调用(虽然我的应用程序缺少一个NavigationInterface(现在)。
private void DoOpenTab(string windowname, string payload = null)
{
DockWindowViewModel window;
string guid;
switch(windowname)
{
case "Gallery":
guid = Guid.NewGuid().ToString();
window = ServiceLocator.Current.GetInstance<GalleryMainViewModel>(guid);
window.ViewModelInstanceKey = guid;
Messenger.Default.Send(
new NotificationMessage(payload),
(window as GalleryMainViewModel).MessageToken);
DockManagerViewModel.AddDocument(window);
break;
}
}
GalleryView(这是一个放在Avalon DockManager-Tab中的UserControl)看起来像这样
<src:PluginView
DataContext="{Binding Gallery, Source={StaticResource Locator}}"
<!-- just normal bindings. -->
</src:PluginView>
我希望,有人可以帮助我一点。我感觉非常接近解决方案,但我真的不知道如何完全解决它。
提前致谢!
答案 0 :(得分:1)
如果这是你的定位器
public GalleryMainViewModel Gallery
{
get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); }
}
这是在你的视图中
<src:PluginView
DataContext="{Binding Gallery, Source={StaticResource Locator}}"
<!-- just normal bindings. -->
</src:PluginView>
然后使用guid创建的VM 可能从未绑定到视图。这取决于视图收到通知消息时会发生什么。
上面的代码告诉视图通过Gallery属性直接从定位器获取其DataContext。如您所述,对于此视图的所有实例,它都是相同的实例。