【问题标题】:Conditionally validate Dynamically generated Controls in Silverlight有条件地验证 Silverlight 中动态生成的控件
【发布时间】:2014-02-13 19:37:50
【问题描述】:

我的表单包含不同类型的控件,例如文本框、下拉菜单、复选框、单选按钮等。所有这些控件都是在运行时从数据库中动态加载的。

我想根据条件对文本框进行验证。例如,如果我们在下拉列表中选择了任何值,那么您必须在文本框中填写详细信息。否则不需要文本框详细信息。

我愿意使用数据库来执行此任务,并且我在我的项目中使用 MVVM 模式。

非常感谢您对此的任何帮助。

谢谢。

【问题讨论】:

  • 您的 ViewModel 中是否有任何属性来表示这些控件中选定\输入的值?
  • 不,我在 ViewModel 中没有选定控件的任何属性,但可以从页面上呈现的所有控件的集合中获取值。
  • 如果你想坚持 MVVM 原则,你可能应该在你的 ViewModel 中有一些东西来代表所有控件的所有值,这样你就可以根据这些值编写一些逻辑来禁用\启用某些控件。你是如何加载和实例化它们的?
  • @fayilt:我正在从数据库加载控件并实例化它们。我的数据库保存控件数据类型和变量的值。然后将这些控件作为子元素添加到与我的视图绑定的 usercontrol 属性之一中。
  • 那么您的 ViewModel 上有一个 UserControls 属性?还是在别处声明?

标签: c# wpf silverlight mvvm


【解决方案1】:

(我以评论开头,但结果太长了)。

理论上,您可以访问 ViewModel 中的所有这些控件及其值。 在不了解程序细节的情况下,很难提出任何有用的建议,但本质上,您需要从 ViewModel 中公开更多属性(可能是布尔值),这些属性将根据控件中的值进行计算。然后,您需要将控件上的 IsEnabled 属性绑定到这些新属性。

听起来很简单,但我认为您存在一些架构问题,这将使我难以实现我上面的建议。为了使它工作并在其他控件的内容更改时自动更新您的控件,您的 ViewModel 需要在每次更新这些布尔属性之一时实现 INotifyPropertyChanged 并引发 PropertyChanged 事件。

我认为您尝试做的事情可以通过 ItemsControl 和 DataTemplates(也许还有 DataTemplateSelectors)来实现。这将允许您在 ViewModel 中存储“数据”(例如 List 或更具体的内容),而无需引用实际的控件,并且相关的 DataTemplates 将为您在 ViewModel 中拥有的不同数据类型添加正确的控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2010-12-28
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多