c# - 使用x :Name in MVVM动态添加控件

标签 c# wpf xaml mvvm

在我们的WPF应用程序中,我们有很多带有固定字段的表格。现在,应使用用户可以定义的字段扩展每个表单。该数据库包含一个表,其中包含这些用户定义的字段,每个字段都带有标签,类型(文本,日期,数字等)。

我发现使用DataTemplates的解决方案很多,但是有一个问题:不可能为每个字段生成唯一的x:Name属性(例如,使用字段ID)。
我们的应用程序严重依赖x:Name属性来执行以下操作:显示/隐藏字段,在数字字段上设置掩码,移动字段...所有这些功能都是从数据库中读取的,因此每个字段都需要一个唯一的标识符。

一种解决方案是使用背后的代码中的x:Name生成这些字段(Winforms方式)。
另一个解决方案是将使用x:Name的功能更改为使用Tag属性。

在实现这些解决方案之一之前,我想确保没有更好的方法。有MVVM方法可以动态生成带有x:Name的字段吗?

编辑

关于为什么在MVVM场景中为什么我的字段需要x:Name似乎有些困惑,所以我将通过一个示例来清除它:

我们软件的一项要求是,用户可以将应用程序中的每个表单字段设置为隐藏或可见。我在这里谈论数千个领域。我可以为每个包含可见性状态的字段创建一个属性,然后从数据库中填充它。

相反,我创建了一个附加属性(以样式附加一次),该属性根据字段名称检索可见性状态并将其应用。因此,此功能与MVVM体系结构分开运行(我从不使用x:Name中的ViewModel)。使用attached属性的缺点是表单字段需要标识,在我的情况下为x:Name属性。

最佳答案

Is there an MVVM way to dynamically generate fields with an x:Name



不,没有。
x:Name是XAML指令,用于在XAML名称范围中唯一标识UI元素,并生成支持字段以将值存储在 View 的代码隐藏类中。

View 模型对此一无所知,也不应该对此一无所知,它当然不应生成此类元素或后备字段,因为这会破坏MVVM模式所涉及的一切。

如果出于某种原因确实需要为UI元素生成唯一名称,则应在 View 的代码背后实现此功能。

MVVM并不是要从 View 中消除与 View 相关的代码,它主要是关于关注点和可测试性的分离。

关于c# - 使用x :Name in MVVM动态添加控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42270503/

相关文章:

wpf - 防止 ControlTemplate 中的控件继承全局样式 (WPF)

c# - WPF 文本框 TAB 空格

c# - XAML 中的触发器

c# - LINQ IEnumerable 扩展是否在其 IEnumerable 上调用 Dispose?

C# 跳过复选框 ListView

c# - 使用响应式(Reactive)扩展,我可以创建可观察的订阅者,该订阅者会阻塞直到满足某些条件或发生超时

c# - 数据库中存储的路径不正确

c# - WPF - ListView 滚动条不显示

c# - 使用 IConverter 处理 WPF/XAML/MVVM 中的 {NewItemPlaceholder}

c# - XAML XMLNS :Local C#