MVVMLight多个instancekeyed-ViewModels及其相应的视图

时间:2017-11-01 12:44:18

标签: c# wpf xaml mvvm mvvm-light

它可能是转储主题,但我不知道如何总结这个问题。

首先,我是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>

我希望,有人可以帮助我一点。我感觉非常接近解决方案,但我真的不知道如何完全解决它。

提前致谢!

1 个答案:

答案 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。如您所述,对于此视图的所有实例,它都是相同的实例。