gpt4 book ai didi

c# - 我应该如何使用 ViewModel?

转载 作者:行者123 更新时间:2023-12-03 10:59:22 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

8年前关闭。




Improve this question




假设我有一个名为 MainWindow 的窗口。

在里面我有一个菜单和一个框架,用于显示与 SelectedMenuItem 关联的页面。

假设我有 10 个页面,分别命名为 Page1、Page2、......、Page10。现在我想在 Frame 中显示这些页面。所有页面都有一些标准控件,如 TextBox、TextBlock、ComboBox 等。

功能:

  • 用户单击任何 MenuItem 并且与该 MenuItem 关联的页面显示给他。
  • 他将根据需要用数据填充所有文本框和组合框。
  • 他将点击保存按钮(请注意,保存按钮位于主窗口而不是任何页面。)
  • 步骤 1,2,3 一直持续到用户希望为止。

  • 现在,我的问题是:
  • 我应该每页使用一个 ViewModel 吗?
  • 我应该只使用 1 个 ViewModel 吗?
  • 使用 Single ViewModel 的优缺点是什么?
  • 使用多个 ViewModel 的优点和缺点是什么?
  • 如果你说我应该使用 Multiple ViewModels,那我应该如何在另一个 ViewModel 中引用一个 ViewModel 的属性呢?

  • 请不要说这取决于程序员的想法。我问这些问题是因为我想创建一个小型数据输入应用程序。我希望它是可维护的。另外,我想以最好的方式创建应用程序。

    最佳答案

    这是主要基于意见。

    不过,我的意见是你需要一个 MainViewModel其中有一个 ObservableCollection<PageViewModel>其中每个都与正确的 DataTemplate 相关联(包含页面 UI)和 ActivePage ContentPresenter 的属性(property)的内容是绑定(bind)的:

    public class MainViewModel
    {
    ObservableCollection<PageViewModelBase> Pages {get;set;}

    PageViewModelBase ActivePage {get;set;}
    }

    public class PageViewModelBase
    {
    //.. logic common to all pages
    }

    public class PageViewModel1: PageViewModelBase
    {
    //.. logic which belongs to Page 1
    }

    public class PageViewModel2: PageViewModelBase
    {
    //.. logic which belongs to Page 2
    }

    //And so on...

    XAML:
    <Window ...>
    <Window.Resources>
    <DataTemplate DataType="{x:Type local:PageViewModel1}">
    <local:Page1/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:PageViewModel2}">
    <local:Page2/>
    </DataTemplate>

    <!-- and so on... -->
    </Window.Resources>

    <ContentPresenter Content="{Binding ActivePage}"/>
    </Window>

    WPF 的 Implicit DataTemplate功能将负责在 ActivePage 时呈现适当的 DataTemplate被改变。

    编辑:

    有几种方法可以处理 ViewModel 到 ViewModel 的通信。

    直接引用
    ViewModel1持有对 ViewModel2 的引用并根据需要对其进行操作:
    public class ViewModel1
    {
    public ViewModel2 ViewModel2 {get;set;}

    void SomeMethod()
    {
    ViewModel2.SomeProperty = "SomeValue";
    ViewModel2.ExecuteSomeAction(someParameter);
    }
    }

    EventAggregator/Messenger 模式:

    This Answer

    关于c# - 我应该如何使用 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541414/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com