- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 MVVMLight,它带有一个 ViewModelLocator。
我最初的项目提出了以下问题。我有一个在启动应用程序时呈现的 MainView。根据单击的按钮,它通过我的 MainView 中的 ContentControl 呈现 View1 或 View2(每个都是用户控件)。
我在我的 MainViewModel 中找到了正确的 View 模型。但我发现我还需要一个 DataTemplate,以便 View1 和 View2 中的用户控件将在 MainView 中正确呈现,否则它只会显示类的基于文本的名称。
我对以下内容感到困惑:
a) 我是否需要 View 模型定位器和 DataTemplate 来完成上述任务?我刚刚跳入 WPF,但认为我读到一个或另一个是必需的,而不是两者都需要。或者更具体地说:为什么我的 View 中有 DataContext="{Binding LiveDataViewModel, Source={StaticResource Locator}}">
(它解析绑定(bind)到它自己的 View 模型)但仍然需要一个 DataTemplate ?
b) 这是 View 模型优先方法还是 View 优先方法?
c) 我尝试了一个代码隐藏的解决方案,它确实花了我 4 行代码来完成完全相同的事情,这让我花了很多类(class)、弯路、eventToCommand 和转换器 [因为触发 View 选择的控件只引发事件不是命令]、数据模板、 View 模型定位器、不同的 View 模型……这看起来是一个巨大的成本,没有任何优势。将其放入代码后面在我看来非常好,因为它是纯 UI 内容(选择 View 并绑定(bind)到内容控件,完成)。我在这里错过了什么吗?我会通过隐藏代码放弃什么?
我是 WPF 和 MVVM 的新手,现在我非常沮丧,因为感觉我在绕着一个看似微不足道的问题转圈。
最佳答案
如果这个答案听起来很基础,我很抱歉,但听起来您可能仍在学习 WPF 并且误解了一些关键的事情。
首先,WPF 应用程序有两层:
DataContext
当您进行绑定(bind)时,您是从数据层提取数据并将其放置在 UI 层中。
ViewModelLocator
影响数据层。它用于查找放置在 UI 对象后面的适当数据对象。
现在,在数据对象直接插入到 UI 层的情况下,例如任何具有 .Content
或 .ItemsSource
属性的东西直接绑定(bind)到它的数据层, WPF 呈现数据对象的默认方式是使用显示对象的 .ToString()
的 TextBlock
。
您可以重写它并告诉 WPF 如何使用 DataTemplate
绘制任何类型的对象。您可以告诉控件使用特定模板呈现,也可以告诉 WPF 使用特定 DataTemplate
自动呈现类型 X 的 UI 层中的任何对象。
所以回答你的问题
a) Do I need both, a view model locator and a DataTemplate to accomplish the above? Or more specific: Why do I have
DataContext="{Binding LiveDataViewModel, Source={StaticResource Locator}}">
in my View but still need a DataTemplate?
这是两个独立的项目。 ViewModelLocator
定位 UI 对象后面的数据项,DataTemplate
告诉 WPF 如何绘制该项目。
您的绑定(bind)是说“将数据层 (DataContext
) 绑定(bind)到 Locator.LiveDataViewModel
”,我最好的猜测是您的 XAML 中的某些内容绑定(bind)了 ItemsSource
或 Content
直接到数据层,使用像 Content="{Binding }"
b) Is this a view model first approach or a view first approach?
我认为无论何时您使用 ViewModelLocator,它都是一种 View 优先的方法,因为 View 负责从定位器获取它的数据项。数据在 View 调用之前不存在。
就我个人而言,我从不使用 ViewModelLocator
,因为我不喜欢它的限制,并且更喜欢模型优先的方法,但这并不意味着您可以根据需要使用它.
c) I tried a code behind solution and it literally took me 4 lines of code to accomplish the exact same thing that took me many classes, detours, eventToCommand & converters [because the control that triggers the choice of view only raises events not commands], data templates, view model locators, different view models...this looks like a huge cost to pay for no advantage whatsoever. Putting this into code behind seems to me perfectly fine because it is pure UI content (choose view and bind to content control, done). Am I missing something here? What would I give up via code behind?
我不知道您的代码是什么样子,但听起来好像其中有很多不必要的代码。 MVVM 模式背后的想法是让所有应用程序逻辑都驻留在类中,而所有用户界面逻辑都驻留在 UI 控件中。 WPF 由于其绑定(bind)系统而非常适合这种设计。
这使得将备用用户界面连接到您的应用程序变得容易,最常见的是测试脚本。它还具有使 UI 与业务逻辑完全分离的优势,这在与专门的 UI 团队合作时非常有帮助。
我个人对每个 WPF 应用程序都使用 MVVM,即使是非常简单的应用程序。在简单的应用程序中,我可能会稍微模糊规则,但当存在 MVVM 选项时,我永远无法回到构建应用程序的旧 WinForms 风格。
如果您有兴趣,我已经为 WPF 初学者写了一些博客文章,如果您是第一次入门,您可能会发现这些文章很有用:
希望这对您有所帮助,祝您好运:)
关于c# - MVVM,对 ViewModelLocator 和 DataTemplate 感到困惑,导致 ViewFirst 与 ViewModel 优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625181/
我似乎用这个撞了一堵砖墙。 在将 Windows Phone 应用程序转换为通用应用程序时,我实现了 mvvm-light 的东西,就像我之前所做的那样。 但是,我现在确实在 App.xaml 中遇到
我有很多代码使用ViewModelLocator在 View 上设置数据上下文。 我当前正在使用一个简单的服务定位器(Simple Injector/CuttingEdge.ServiceLocati
我正在使用 MVVM Light 学习 WPF,但我的可移植类库存在问题。我按照这个教程:http://www.codeproject.com/Articles/536494/Portable-MVV
我想自己实现 ViewModelLocator。所以我实现了世界上最简单的应用程序。我做了所有在this教程。但我仍然遇到异常: XamlParseException occured Exceptio
我的 MVVM Light 应用程序中的 ViewModel 有一些资源,必须在应用程序关闭时进行处理。我在 ViewModelLocator 中有 CleanUp 方法来执行此操作。在我的应用程序中
我已经使用 Autofac 创建了一个自定义 View 模型定位器,并通过 App.xaml 正常设置它,就像通常使用它们中的大多数一样。我的问题是我现在如何进行单元测试?每次我尝试测试初始化 V
我在我的应用程序中使用 MVVM Light,在解决方案中有多个程序集。 如何在每个程序集中都有一个 ViewModelLocator 而不在 App.xaml 资源中定义? 通常 ViewModel
这个问题可能看起来很幼稚,但我无法理解 ViewModelLocator.cs 文件中的这段代码: static ViewModelLocator() { ServiceLocator.Set
我有一个设计问题。请查看所附图片以了解应用程序设计。基本上我只需要帮助来找到正确的方法。 我有一个包含 TileUserControl 的 View 和 ViewModel。它获取一组图 block
我有一个名为 MainViewModel 的 ViewModel(当然),它包含多个构造函数,如下所示: [ImportingConstructor] public MainViewModel(IWi
为什么MVVM Light中ViewModelLocator的构造函数和成员不是静态的?考虑到我在构造函数中执行 IOC 注册过程是这样的: SimpleIoc.Default.Register();
我被困住了。我一直在尝试让 MVVM Light 与 Silverlight 一起工作。这是我的 app.xaml 所以我已经引用了 View 模型,即使系统正确地选择了它,我也经常收到错误:命名空间
我最初在 MVVM Light CodePlex 页面上发布了这条消息,但还没有收到回复,所以我希望这里有人可以帮助我。这是问题: 我最近开始使用 MVVM(也是 WPF 的新手——所有这一切的学习曲
这是我的场景,我需要创建一个简单的 uwp 应用程序,并且我有一个 View 模型和多个 View ..我正在使用 prism mvvm/unity 。 主页.xaml
我正在开发一个在 windows 8.1 和 windows phone 8.1 上运行的通用应用程序。 我遇到了 App.xaml 文件中标题中提到的错误。 App.xaml 文件位于 MyApp.
我试图掌握 ViewModelLocator 的概念(在 MVVM Light 中,尽管问题通常适用于 ViewModelLocator 的概念,无论使用哪个 MVVM 框架),我很难弄清楚如何使用它
正如标题所说,我需要一些帮助来设置我的 ViewModelLocator。这是一个使用 Galasoft MVVM Light Toolkit 的 Windows Phone 7 应用程序。 我的应用
是否可以在 UserControl 上使用 MVVMLight ViewModelLocator。我已将其添加到我的用户控件中,方式与在主窗口上相同,但我在 VS2010 中收到错误/弹出窗口,指出“
我正在尝试使用 MVVM Light Toolkit 实现一个应用程序,但不知何故我被 ViewModelLocator 困住了。 虽然我很清楚如何从 XAML 中的 View 和 View 的代码隐
我一直在按照mvvmlight 编写一个项目。我有 3 个 xaml 文件 MainWindow, View1, View2, 我已经在我的 ViewModelLocator 中注册了所有三个 Vie
我是一名优秀的程序员,十分优秀!