在我们的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/