【发布时间】:2018-04-13 18:56:15
【问题描述】:
它可能是一个转储主题标题,但我不知道如何总结这个问题。
首先,我是 MVVM 和 MVVMLight 的新手。
我正在尝试创建特定视图模型(例如 GalleryViewModel)的多个实例,并在绑定到 GalleryViewModel 特定实例的相应视图中显示相应数据。因此,用户打开了(例如)五个 GalleryView,而在后台,每个 GalleryView 都必须绑定到相应的 GalleryViewModel。
因此,我使用 GUID 作为 InstanceKey 调用 SimpleIoC 的“GetInstance”。
问题是,这样,当视图模型中的数据发生变化时,视图不会更新。我发现,只有当我使用实例键实例化视图模型时,才会出现这种情况。
所以我认为,我必须使用 instancekey XY 将当前视图链接/绑定到该视图模型。但我不知道该怎么做。
我的“架构”是这样的:MainViewModel 调用 GetInstance(GUID) 方法。在 MainView 中,使用 GalleryView 显示/创建一个新的 UserControl。它的数据上下文通过 XAML 绑定到 GalleryViewModel(但这可能是问题所在,因为此绑定不知道 GUID,因此它可能会绑定到错误的实例 (?) 并且 DataBindings 不会得到更新。
这是一些代码:
ViewModelLocator 只返回一个实例(也许这就是问题所在)
public GalleryMainViewModel Gallery
{
get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); }
}
从 MainViewModel 中调用“导航”(尽管我的应用程序缺少 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>
希望有人能帮帮我。我感觉非常接近解决方案,但我真的不知道如何完全解决它。
提前致谢!
【问题讨论】:
标签: c# wpf xaml mvvm mvvm-light