【问题标题】:How to add UserControl to Canvas of MainView from multiple ViewModels in WPF MVVM如何从 WPF MVVM 中的多个 ViewModel 将 UserControl 添加到 MainView 的 Canvas
【发布时间】:2012-05-09 07:22:54
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 你在使用框架吗?你不能在 标签之间添加子控件吗?或者你问的是绑定?
  • 有很多 ChildControl,用户通过点击一个按钮来决定它们,所以我必须动态添加
  • 你能添加一些描述吗?我不知道是哪个问题
  • 我已更新问题以获得更好的描述。如果您需要更多,请告诉我。
  • 你有一个类似于我的问题,你有一个 MianViewModel 和 ViewModel 为每个孩子添加stackoverflow.com/q/10404313/816721 你可以看到我的解决方案,但有一个缺点是不完全 MVVM

标签: c# wpf mvvm view viewmodel


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我说对了吗:您的控件的 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) 并根据需要使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多