【问题标题】:WPF: right way to do a Tabcontrol with MVVM patternWPF:使用 MVVM 模式执行 Tabcontrol 的正确方法
【发布时间】:2013-07-26 08:36:15
【问题描述】:

首先,我是 WPF 的新手,尤其是 MVVM 的新手。我有一个带有不同选项卡的窗口和一个非常大的 ViewModel,其中包含每个选项卡内容的业务逻辑。我知道这是不对的,所以现在我试图做得更优雅:

正如我在谷歌上看到的,一个想法是做一个“基础”视图模型的集合,从它继承每个选项卡的子视图模型,并在窗口的视图模型中这个“基础”视图模型的集合。

TabBaseViewModel
Tab1ViewModel inherits TabBaseViewModel
Tab2ViewModel inherits TabBaseViewModel

MainWindow ViewModel --> Collection of TabBaseViewModel

选项卡的内容彼此之间没有任何共同点。

我必须如何进行?

【问题讨论】:

    标签: wpf mvvm viewmodel tabcontrol


    【解决方案1】:

    您应该考虑using an MVVM framework if you're using MVVM。以Caliburn.Micro 为例,您可以将主视图定义为:

    <TabControl x:Name="Items">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding DisplayName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>
    

    其中数据上下文是具有集合的Conductor 类型。 Items 属性将公开您的视图模型的集合:

    public class MainViewModel : Conductor<IScreen>.Collection.OneActive
    { 
        private OneOfMyViewModels oneOfMyViewModels;
    
        private AnotherViewModel anotherViewModel;
    
        protected override void OnInitialise()
        {
            // Better to use constructor injection here
            this.oneOfMyViewModels = new OneOfMyViewModels();
            this.anotherViewModel = new AnotherViewModel();
    
            this.Items.Add(this.oneOfMyViewModels);
            this.Items.Add(this.anotherViewModel);
        }
    
        protected override void OnActivate()
        {
            base.OnActivate();
            this.ActivateItem(this.oneOfMyViewModels);
        }
    }
    
    public class OneOfMyViewModels : Screen
    {
        public OneOfMyViewModels()
        {
            this.DisplayName = "My First Screen";
        }
    }
    

    【讨论】:

    • 好的,但在那一刻,我几乎拥有自己开发的应用程序,没有任何框架。我尝试使用 Prism 和 MVVMLight,但一开始我发现有点困难,我尝试在没有任何工具的情况下逐步完成基本架构和类。
    • 这作为一个学习练习很有用,但你最终会想要一个框架,除非你愿意在其他人已经按照高标准实施的东西上投入大量工作
    • 如果您想将视图模型类型的集合绑定到 TabControl,请查看stackoverflow.com/questions/5650812/…
    • 这与我推荐的完全相反...我的意思是 mvvm 框架,尤其是 caliburn
    【解决方案2】:

    我发布了另一个问题的答案,该答案显示了如何做到这一点:How to Get a Reference to a ViewModel

    这是一个非常简单的例子,但希望能让你走上正确的道路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2016-04-26
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多