在我们的WPF应用程序中,我们有很多带有固定字段的表单。现在,每个表单都应该扩展为用户可以自己定义的字段。数据库包含一个包含这些用户定义字段的表,每个字段都有一个标签,一个类型(文本,日期,数字,......)等。
我找到了许多使用DataTemplates的优秀解决方案,但是有一个问题:无法为每个字段生成唯一的x:Name
属性(使用该字段id例如)。
我们的应用程序在很大程度上依赖于x:Name
属性来执行以下操作:显示/隐藏字段,在数字字段上设置掩码,移动字段,...所有这些功能都是从数据库中读取的,因此每个字段的唯一标识符需要。
一种解决方案是在代码隐藏(Winforms方式)中使用x:Name
生成这些字段。
另一种解决方案是将使用x:Name
的功能更改为使用Tag
属性。
在实施其中一个解决方案之前,我想确保没有更好的方法。是否有MVVM方式动态生成带有x:Name?
的字段修改
为什么我需要在MVVM场景中为我的字段提供x:Name
似乎有些混乱,所以我将用一个例子清除它:
我们软件的一个要求是,我们的应用程序中的每个表单字段都可以被用户设置为隐藏或可见。我在这里谈论成千上万的领域。我可以为包含可见性状态的每个字段创建一个属性,并从数据库中填充它。
相反,我创建了一个附加属性(在样式中附加一次),该属性根据字段的名称检索可见性状态并应用它。所以这个功能与MVVM架构分开运行(我从不使用x:Name
中的ViewModel
。使用附加属性的缺点是表单字段需要标识,在我的情况下是x:Name
属性。
答案 0 :(得分:0)
是否有MVVM方式动态生成带有x:Name
的字段
不,没有。
x:Name
是 XAML 指令,用于唯一标识XAML名称范围中的UI元素,并生成支持字段以将值存储在视图的代码隐藏类中。
视图模型不会也不应该对此有任何了解,它肯定不会生成这样的元素或支持字段,因为这会破坏MVVM模式的所有内容。
如果由于某种原因确实需要为UI元素生成唯一的名称,则应在视图的代码隐藏中实现此功能。
MVVM不是要从视图中消除与视图相关的代码,而是主要关注关注点和可测试性的分离。