【问题标题】:Instantiate one View per Viewmodel (multiple Views of the same type)每个 Viewmodel 实例化一个 View(相同类型的多个 View)
【发布时间】:2016-07-28 14:06:37
【问题描述】:

有没有办法为每个 Viewmodel 实例化一个视图?我目前将视图应用到他们的视图模型

<DataTemplate DataType="{x:Type vm:CustomerViewModel}">
    <vw:CustomerView/>
</DataTemplate>

但由于我的任务是让视图记住其焦点文本框的选择,我需要我的程序为每个 Viewmodel 创建一个视图,而不仅仅是更改 DataContext。


我已经为此搜索了整整两周,我的问题是我是否(以及如何)实例化相同类型的多个视图(而不是如何记住 TextBox 选择):)

【问题讨论】:

    标签: c# wpf mvvm data-binding wpf-controls


    【解决方案1】:

    我处理这个问题的方法是让我的 ViewModel 成为后面代码中 xaml 的输入。例如:

    public partial class AddMember : Window
    {
        StructureGeneratorVM mainVM = null;
        public AddMember(object vm)
        {
            mainVM = (StructureGeneratorVM)vm;
            DataContext = mainVM;
            InitializeComponent();
        }
    }
    

    然后,当我从 Base Window 的 VM 打开窗口时,我传入 this,然后我的程序中的所有窗口都在同一个 VM 上工作(属于原始 MainWindow)

    这是你要问的吗?

    【讨论】:

    • 这个想法很好,但我的问题是不同的:我的问题是 WPF 总是只创建一个视图类型的对象,然后在切换到“另一个实例”时更改 DataContext视图(有些人会如何期望它)。如果有任何肮脏的技巧可以改变我的问题将得到解决......
    • 当您创建视图的“另一个实例”时,将数据上下文与创建一起传递?
    • 是的,当然...但是我如何创建另一个视图实例? 如上所述,当按 DataTemplate 将视图应用于视图模型时,只有一个视图对象会被创建并且只有 DataContext 改变(而我想创建另一个视图)
    • 我明白了,所以你说你不想共享 viewModel。你想让每个窗口都在一个独立的视图模型上工作吗?
    • Viewmodel 不是问题所在。我需要每个 ViewModel 一个视图。所以每个 ViewModel 都应该有它自己的 View 实例,并且这个 View 应该有它的 ViewModel 作为 DataContext。问题是 WPF 总是只创建一个视图的对象实例,如果应该有多个视图实例,例如在 TabControl 中,则在创建新 ViewModel 时不会创建另一个 View(由于 DataTemplate,WPF 知道如何将 View 与 ViewModel 关联)。 它只是改变了一个 View 的 DataContext,而你会期望有多个 View。
    【解决方案2】:

    感谢所有建议,但我自己找到了解决方案。对于任何有类似问题的人;此链接将有所帮助:http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization

    【讨论】:

      【解决方案3】:

      您的视图模型应包含选择的状态,该状态应绑定在您的视图中。然后DataTemplate 就可以正常工作了。

      【讨论】:

      • 感谢您的想法,但我已经尝试过了...我的问题是是否可以实例化多个视图...老实说,我看不出不这样做的理由因为它甚至不会以我认为的显着方式影响性能
      • 当然,它只是非常迂回,需要您跟踪所有关联。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多