0

我有一个带有 Canvas 的 MainWindowView(Window),我在其中添加了我的 Views(UserControls)。

MainWindow 中的 Canvas 是从 Canvas 派生的自定义 Canvas,因此可以将其中的 Views 移动到这里和那里,并且可以将其带到前台或发送回。

我通过将命令绑定到按钮将视图添加到 MainWindowView 的画布。因此,当我单击按钮时,会在画布中添加一个视图。

但是,我的问题是,我想从已经在 MainViewModel 画布中的视图的 ViewModel 中将另一个视图添加到 MainViewModel 的同一画布中。

由于我用来绑定 Canvas 的 ObservableCollection 在 MainViewModel 中,因此我只能从 MainViewModel 添加 View。

当我尝试使用其他 ViewModel 中的 MainViewModel 时,我必须为其创建一个新对象,这使得 Canvas 中的旧视图被新视图替换。

有没有办法解决这个问题。如果不是,那么使用 MVVM 框架有什么用。请帮忙...

4

2 回答 2

1

使用 Calibrum Micro,它将在这方面为您提供帮助

于 2012-05-02T15:20:28.027 回答
1

我做对了吗:您的控件的 DataContext 与 Window 的不同,您需要从那里访问它吗?

基本上可以通过设计避免这种情况(使用依赖注入将 MainViewModel 实例放入命令中),但实际上有一种 WPF/MVVM 友好的方法可以解决这个问题:

使用命令将控件添加到 MainViewModels ObservableCollection

<Button Command="{Binding Path=CreateViewCommand}" CommandParameter="{Binding}" />

从您的控件(您称为视图)中,您必须使用祖先绑定:

<Button Command="{Binding Path=DataContext.CreateViewCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
    CommandParameter="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

在您的命令中,您可以将参数转换为其原始类型 (MainViewModel) 并根据需要使用它。

于 2012-05-03T13:13:41.980 回答