【问题标题】:How to apply Metadata from a ViewModel to the View in WPF with MVVM如何使用 MVVM 将 ViewModel 中的元数据应用于 WPF 中的视图
【发布时间】:2018-04-25 15:39:05
【问题描述】:

我有一个具有如下属性的 viewModel 和一组在整个 viewmodel 中使用的特定属性。

public class MyViewModel : BaseModel
{
    [StringLength(50), Required]
    [SetLockedForExistingEntities]
    public string FirstName { get ...  set ... }

    public bool IsInNewMode { get; }
}

现在我想以一致的方式在视图中应用此类元数据。像...如果绑定,则从 MaxLengthAttribute 设置 TextBox 最大长度。如果设置了 SetLockedForExistingEntitiesAttribute,则禁用控件以防 viewModel 未处于某些“新”模式等。

使用自定义 MarkupExtension 替换 VM 绑定的“绑定”是否可行/是个好主意?还是使用 Behavior(通过附加属性应用)会更好地尝试将任何可以从绑定的 ViewModel 属性应用到它所附加的控件?

用法会像

(A) 从 TextBox.Text 读取绑定并应用行为的附加依赖属性 <TextBox Text="{Binding Model.FirstName, ValidatesOnDataErrors=True}" "bb:MyBindingHelper.ApplyViewModelBehaviors="True" />

(B) 多合一的自定义标记扩展 <TextBox Text="{BindingWithModelBasedBehaviors Model.FirstName}" />

【问题讨论】:

    标签: wpf mvvm data-binding


    【解决方案1】:

    您可以编写一个标记扩展,从数据上下文中获取属性并读取属性。
    这有点复杂,但您可以获取引发源更改事件的属性的属性名称。

    在我看来,这更像是一种验证。 您可以在基本视图模型中实现 inotifydataerrorinfo 并在那里编写代码来使用属性验证属性。
    这就是代码的工作原理:
    https://gallery.technet.microsoft.com/scriptcenter/WPF-Entity-Framework-MVVM-78cdc204

    视图告诉视图模型哪个属性的值刚刚传递给视图模型。 您可以扩展用于提高属性更改的方法,以将属性名称传递给验证。 或者,您甚至可以在设置属性值之前从属性设置器中调用的方法进行检查,如果新属性验证失败,则不设置值。

    由于特定属性以特定方式验证失败,您可以运行操作。
    我链接的那个应用程序的生产代码版本也有一个使用的谓词字典和属性。他们可以在其中包含引用和设置其他视图模型属性的代码。

    【讨论】:

    • 已经使用 IDataErrorInfo 处理了验证。目前我有例如在 xaml 中: 现在我考虑(a)合并该助手属性进入 MyBindingHelper.ApplyViewModelBehaviors="True" 或(b)将其与某种 中的绑定合并,并让该标记扩展始终如一地做所有事情
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多