具有相应视图的 MVVMLight 多实例键控视图模型
MVVMLight multiple instancekeyed-ViewModels with corresponding Views
这可能是一个dump subject-title,但我不知道如何总结这个问题。
首先,我是 MVVM 和 MVVMLight 的新手。
我正在尝试创建特定视图模型(例如 GalleryViewModel)的多个实例,并在相应视图中显示相应数据,绑定到 GalleryViewModel 的特定实例。因此用户打开了(例如)五个 GalleryView,而在后台每个 GalleryView 必须绑定到相应的 GalleryViewModel。
因此,我将带有GUID的SimpleIoC的"GetInstance"调用为InstanceKey。
问题是,那样的话,当视图模型中的数据发生变化时,视图不会得到更新。我发现,只有在我使用实例键实例化视图模型时才会出现这种情况。
所以我认为,我必须 link/bind 使用 instancekey XY 将当前视图转换为该视图模型。但是我不知道怎么做。
我的 "architecture" 是这样的:MainViewModel 调用 GetInstance(GUID) 方法。在 MainView 中,新的 UserControl 与 GalleryView 一起获得 displayed/created。它的数据上下文通过 XAML 绑定到 GalleryViewModel(但这可能是问题所在,因为这个绑定不知道 GUID,所以它可能绑定到错误的实例(?)并且 DataBindings 没有得到更新.
这是一些代码:
ViewModelLocator returns 只有一个实例(也许这就是问题所在)
public GalleryMainViewModel Gallery
{
get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); }
}
从 MainViewModel 内部调用 "navigation"(尽管我的应用程序缺少 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>
希望有人能帮帮我。我感觉真的很接近解决方案,但我真的不知道如何完全解决它。
提前致谢!
如果这在您的定位器中
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。正如您所说,对于此视图的所有实例,这将是相同的实例。
这可能是一个dump subject-title,但我不知道如何总结这个问题。
首先,我是 MVVM 和 MVVMLight 的新手。
我正在尝试创建特定视图模型(例如 GalleryViewModel)的多个实例,并在相应视图中显示相应数据,绑定到 GalleryViewModel 的特定实例。因此用户打开了(例如)五个 GalleryView,而在后台每个 GalleryView 必须绑定到相应的 GalleryViewModel。
因此,我将带有GUID的SimpleIoC的"GetInstance"调用为InstanceKey。
问题是,那样的话,当视图模型中的数据发生变化时,视图不会得到更新。我发现,只有在我使用实例键实例化视图模型时才会出现这种情况。
所以我认为,我必须 link/bind 使用 instancekey XY 将当前视图转换为该视图模型。但是我不知道怎么做。
我的 "architecture" 是这样的:MainViewModel 调用 GetInstance(GUID) 方法。在 MainView 中,新的 UserControl 与 GalleryView 一起获得 displayed/created。它的数据上下文通过 XAML 绑定到 GalleryViewModel(但这可能是问题所在,因为这个绑定不知道 GUID,所以它可能绑定到错误的实例(?)并且 DataBindings 没有得到更新.
这是一些代码:
ViewModelLocator returns 只有一个实例(也许这就是问题所在)
public GalleryMainViewModel Gallery
{
get { return ServiceLocator.Current.GetInstance<GalleryMainViewModel>(); }
}
从 MainViewModel 内部调用 "navigation"(尽管我的应用程序缺少 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>
希望有人能帮帮我。我感觉真的很接近解决方案,但我真的不知道如何完全解决它。
提前致谢!
如果这在您的定位器中
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。正如您所说,对于此视图的所有实例,这将是相同的实例。