- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 ViewModel 有一个依赖属性,它是我的 View 的 DataContext。 ViewModel 没有对 View 的引用。 ViewModel 上的属性将引用 View 上的控件,但我需要能够在 XAML 中设置此属性。
这怎么可能?我的一个想法是开发一个具有 Property 属性和 Value 属性的自定义控件,这样您就可以在 View 中执行类似的操作以在 ViewModel 上设置属性:
<PropertySetter Property="{Binding MyViewModelDependencyProperty}" Value="{Binding ElementName=aControlOnMyView" />
在我走这条路之前,我想看看是否还有其他方法可以采用?
感谢 Ray 的详细回复,但如果我向您提供有关我试图解决的问题的更多详细信息,您可能会更好地理解我为什么提到我所采用的方法。
基本上,我要做的是在用户点击按钮时将焦点设置到文本框。我已经编写了一个附加属性,您可以将其附加到 Button 控件,指定触发事件是什么(在本例中为“单击”事件),然后指定要关注的控件。这非常有效,并且将所有内容都保存在 XAML 中。
但是,我现在有一个用例,在该用例中,应将焦点设置为来自作为工具栏一部分的按钮上的单击事件的任意文本框。这个工具栏本身就是一个用户控件,它位于另一个用户控件内,而另一个用户控件又位于另一个用户控件内!这个工具栏需要在各种不同的表单中重复使用,每次单击按钮后设置焦点的控件都会因表单而异。
这就是为什么我有想法让焦点控件(即文本框)成为 View 模型本身的一个属性(准确地说是在我的 ViewModel 基础上),并拥有 ViewModel 基础代码(工具栏绑定(bind)到它) ,在单击按钮时将焦点设置到控件(并且在 ViewModel 基础上调用例如添加/编辑方法)。
在单元测试领域,关注属性的控件将为空,因此不会调用它的 .Focus() 方法。所以我在那里看不到问题。我的问题是如何从 XAML 设置焦点控件属性,这就是我产生 PropertySetter 想法的原因。
我不喜欢 ViewModel 对 View 上的控件有任何引用,但我看不到另一种方法来实现我的需要。如果决定是否将焦点设置到控件的逻辑非常复杂怎么办?这肯定会放在 ViewModel 中吗?因此,具有此 UIElement 属性的 ViewModel 是否有任何危害?它仍然不知道它绑定(bind)到的特定 View ,它只知道有一个控件需要在 ViewModel 上发生某些操作时将焦点设置到该控件。
最佳答案
我的第一 react (而且是强烈的 react )是说“别那样做!”通过为您的 View 模型提供对 UI 一部分的引用,您正在打破使 View 模型如此强大和有用的封装。
例如,如果您想对 View 模型进行单元测试或将其序列化到磁盘怎么办?在每种情况下,您的 UI 部分都不会出现,因为根本没有 View 。您的测试将无法覆盖,您的重构将不完整。
如果您的 View 模型实际上需要对 UI 对象的引用并且没有更好的方法来构建它,那么最好的解决方案是让 View 模型本身构建它需要引用的那些控件。然后,您的 View 可以通过绑定(bind)将该控件合并为 ContentPresenter 的内容,并提供样式来配置控件,包括提供其内容的 ControlTemplate。因此:
public class MyViewModel
{
public ListBox SpecialControl { get; set; }
public MyViewModel()
{
SpecialControl = new ListBox();
}
}
和
<DataTemplate TargetType="{x:Type local:MyViewModel}">
<DataTemplate.Resources>
<Style TargetType="ListBox" ... />
</DataTemplate.Resources>
...
<ContentPresenter Content="{Binding SpecialControl}" />
</DataTemplate>
其他可能性是:
我的选项 #2 如下所示:
<DataTemplate TargetType="{x:Type MyViewModel}">
...
<TextBox local:PropertyHelper.SetViewModelToThis="SpecialControl" />
...
</DataTemplate>
SetViewModelToThis PropertyChangedCallback 中的代码会从 DataContext 中获取 View 模型,对其进行反射以找到“SpecialControl”属性,然后将其设置为 TextBox。请注意,SetViewModelToThis 的实现必须考虑到 DataContext 未立即设置的可能性,并且它可能会更改,需要删除旧设置并创建新设置。
关于wpf - 从 WPF 中的 View 设置 ViewModel 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3091261/
Glenn Block 和我一直在研究 ViewModel 模式。我们一直在尝试找出与该模式相关的最大痛点,目标是添加框架支持以减轻痛苦。 今晚,格伦发帖,“View Model” – the mov
如果我使用 Views 创建 ViewModel 实例且 ViewModel 没有对 View 的引用的方法,我不知道创建 viewmodel 关系的正确方法是什么。 假设我们有 ChildView
当从缓存中重新加载 ViewModel 时,我需要能够拦截框架并执行重新初始化。由于没有重新创建 ViewModel,我既不能使用 Init()、MvxViewModel.InitFromBundle
我的业务模型(实际上它用于使用 Entity Framework 6 读取数据)看起来像: class Profile : NameDescriptionBase { public virtu
我在swift中玩MVVM遇到了这种情况:我为 tableView 创建了模型,其中包含对象列表和对象计数。有点像 class TableViewViewModel { var count :
我正在研究由以下部分组成的应用程序区域: Explorer - 包含 TreeView PropertyInspector - 包含一个 PropertyGrid 编辑器 - 包含一个 Explore
我正在使用 MVVM-Light,并且我有一个列出了销售人员的 DataGrid 工作。用户可以双击打开一个子窗口,该窗口将在网格上列出他们的销售,用户将能够在该网格下填写一些文本框以添加新的销售。
是否有适当的方法来创建包含 subViewModel 的 C#/WPF ViewModel ? 目标是: 我有一个主窗口。该窗口用于读取/创建图像。窗口上有一个按钮,可以在 2 个 UserContr
首先,如果这很简单,我必须道歉。我对 WPF 和 MVVM 非常陌生,我想确保我没有违反任何 WPF 或 MVVM 概念。此外,对于下面的冗长解释(试图提供所有细节): 我目前正在引用具有所有业务逻辑
我有一个架构问题,以及一个我想提出意见的可能解决方案。 我习惯于 WP7 的 MVVM 架构(尽可能但不幸的是,有时 sdk 似乎朝着相反的方向发展)。 WP7 强制采用 ViewFirst 方法,我
鉴于以下情况: ViewModelA 启动 ViewModelB(当然,通过一个通用 Controller ,它使用 Ioc 和 DI 来解析所需的类型)。 ViewModelB 需要在 ViewMo
在我的 WPF MVVM 应用程序中,使用 Caliburn.Micro,我有一个 ViewModel,CreateServiceViewModel,在单击按钮时,它会在单独的窗口中打开一个 Grid
假设我有一个采用特定 ViewModel 的页面( View ): @model IEnumerable 在这个页面中,我有一个通过另一个 ViewModel(我们称之为 PostModel)发布数据
我有两个相似的 ViewModel,我需要将一个转换为另一个。 这是第一个: using System; using System.Collections.Generic; using System.
我有两个 View 共享来自某个 View 模型的一个可观察集合,但具有不同的 Collection View 参数。在 MVVM Light 中实现它的正确方法是什么?是否支持非静态虚拟机?我如何管
我有 2 个 View 模型 - 主视图模型** 存储 View 模型 StorageViewModel.kt class StorageViewModel @ViewModelInject cons
我有一个 AddressesViewModel 保存用户最喜欢的地址,另一个 SearchViewModel 保存搜索到的地址。当用户搜索地址时,我必须通过检查收藏夹数组来检查该地址是否是收藏夹。正确
首先,我看过this post并没有找到我的问题的答案。 我不确定这是否是汇总 型号 类或聚合 查看型号 类,但这就是我所拥有的: 在我的 WPF(使用 Prism)应用程序中,我有一个 View “
我的 View 中有这些过滤器,它们都会更新 FilterViewModel,然后由它负责过滤数据。其中一个 View ,SearchAddressView 需要 PlacemarkViewModel
依赖的 ViewModel 通过构造函数(IoC 容器)注入(inject)。 示例:ProductSelectionViewModel 使用 ShoppingBasketViewModel。 这是一
我是一名优秀的程序员,十分优秀!