gpt4 book ai didi

wpf - MVVM,构造 View 的最佳方式

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

我已经为我的应用程序制作了一个根 AppView,一个根 AppViewModel 作为所有东西的容器。在应用程序 View 中,我有一个 TabControl,每个选项卡都有自己的任务要做。一页导入数据、一页发布、一页管理等:

App_View[Model] // root
{
TabTask1_View[Model], TabTask2_View[Model], TabTask3_View[Model] // tab items
}

1)在 MVVM 中,我将整个 View 和 View 模型分组到主应用程序 View 和应用程序模型 View 中是标准的吗?

2) 在 MVVM 中,应该为每个 View 和虚拟机实现模型?或者,如果我将整个模型实现为一个或两个类文件并在它们之间共享模型,这是否是标准的?我个人认为模型部分并不特定于某个 View ,例如可以在代码中的任何地方使用的“学生”类,并且不限于某个 View 。基于此,如果模型是通用的和共享的,那么遵循命名约定 Class + 'Model' 是否很好?像StudentModel?像我说的那样在通用或共享类名之后添加“模型”是否有帮助/有必要?

3) 在 WPF 中,实现 View 的最佳方式是什么?我想非常轻松地编辑和设计,没有任何限制,并且它应该足够标准以涵盖 future 的需求。有 4 个东西可以使用:Window、Page、UserControl 和 DataTemplate。哪一个是您的最佳选择?用户控件还是页面?

4) 在 WPF 中,如何基于 MVVM 方法在运行时动态加载 tabItem 内的 UserControl/Page(View)?

最佳答案

你在作弊。这是4个问题!

1)

关于如何对 View 和 View 模型进行分组,我看到人们将 View 和 View 模型放在同一个命名空间/文件夹中,而其他人则根据功能将它们分开到不同的文件夹中。最适合您的选择是适合您/您的团队的。没有“正确”的方式。

2)

保持干燥 - 所以不要重复自己。重用代码是完全明智的。如果您有共同的类(class),请保持共同。至于命名,类的名称应该有助于解释它的作用:我相信你能够弄清楚 NavigationService、NavigationMenuItem 和 NavigationMenuView 类做了什么,并且可能可以将一个很好的心理模型放在一起他们相关。所以 - 如果命名一个类 BlahViewModel 或 BlahModel 对你有用,那就去做吧。

3) 实现 View :

一个窗口总是独立显示。页面旨在用于导航应用程序(通常带有后退和前进按钮,例如 Internet Explorer)。页面必须托管在 NavigationWindow 或 Frame 中。如果您正在查看动态添加/删除内容,将内容添加到 ItemsControls(TabControl 等),那么您将希望创建用户控件。您可以将用户控件放在 Page 和 Window 对象中,放入其他控件等中,这确实是 WPF 开发人员的主力。

4)

您有多种选择:

1)快速而肮脏的方法是创建 DataTemplate ,在获得 X 类型的 ViewModel 后,加载 ViewModel 并将其应用于其数据上下文。这将允许您将 ViewModel 直接注入(inject)控件并具有正确的 View 渲染。

一个例子:

查看.xaml

<ContentControl Content="{Binding Error, Mode=OneWay}" />

View 模型:
        private void ReceiveError(ErrorViewModel errorModel)
{
//if (errorModel.AcceptCommand==null || errorModel.AcceptCommand is NoOpCommand)
errorModel.AcceptCommand = new DelegateCommand(ClearError);
Error = errorModel;
}
public ErrorViewModel Error
{
get { return _error; }
set
{
_error = value;


_propertyChangedHelper.NotifyPropertyChanged(this, () => Error);
}
}

Styles.Xaml(资源字典)
<DataTemplate DataType="{x:Type vm:ErrorViewModel}">

<DataTemplate.Resources>
<conv:CustomisableBooleanToVisibilityConverter x:Key="VisibilityConverter" TrueValue="Visible" FalseValue="Collapsed" />
</DataTemplate.Resources>
<Popup AllowsTransparency="True" PopupAnimation="Fade" Placement="Center" StaysOpen="True"
PlacementTarget="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type v:ModuleView}}}"
IsOpen="True" Width="400" SnapsToDevicePixels="True"/>

所以你可以看到我将我的 View 模型直接注入(inject)到内容控件中,它使用绑定(bind)到 View 模型类型的数据模板来为其查找 View 。

2)

更好的选择是使用 DataTemplateSelector。这基本上允许您指定哪些模板可用于控件,然后使用您编写的逻辑来确定要使用的数据模板。你可以找到一个例子 here .

3)

使用将 UI 控件抽象出来的框架。 Microsoft 有一个框架(免费)可以执行此操作,称为 Prism。基本上,不是将用户控件直接添加到 TabControl、ItemsControl 等,而是将控件添加到命名的“区域”。该区域映射到底层控件,并放置了一个适配器来管理当您要求它时如何添加/删除 UserContorl。您可以找到对此 here 的深入讨论.但请注意,Prism 是一个应用程序框架,因此实现它不是 3 小时的工作。

关于wpf - MVVM,构造 View 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17230405/

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