c# - 更新绑定(bind)源后如何执行 ICommand?

标签 c# .net wpf mvvm

假设我有一个 WPF TextBox:

<TextBox Text="{Binding Foo}" />

在属性 FooTextBox 更新后,是否有办法执行一些 ICommand(即由 TextBox 而不是其他控件或代码)?

我不想使用绑定(bind)的 SourceUpdated 事件,因为我想避免“代码隐藏”。

最佳答案

您是否意识到如果您最终留下了一些代码,MVVM 警察不会来抓您?使用事件命令等本质上只是在 XAML 中编码,而不是在 C# 中编码。无论哪种方式,您都需要将事件与命令 Hook ,因为控件不会为您所追求的内容公开命令。

我想这就是你想要的,如果我走错了路请告诉我:

您想知道对 Foo 的更新何时来自文本框并且仅来自文本框。即,如果对 Foo 的更新来自某些您不希望命令运行的代码,对吗?

如果是:

        <TextBox Name="Fred" Text="{Binding Foo, NotifyOnSourceUpdated=True}" SourceUpdated="Fred_SourceUpdated"/>

那么在“邪恶”的代码背后有:

private void Fred_SourceUpdated(object sender, DataTransferEventArgs e)
    {

    }

在该方法中,您可以将 View 的数据上下文转换为 View 模型并调用您想要的任何命令。如果其他东西更新了 Foo,则不会调用源更新事件。

如果您真的不想像您在 OP 中提到的那样隐藏代码,那么您可以执行附加行为,但这对于“无意义”的要求来说太过分了。您的逻辑取决于更改是否来自文本框这一事实意味着您的 View 已经不仅仅是一个 View 。这种方法仍然允许您让您的命令代码在您的 VM 中完全可测试。

第二次编辑

您还可以查看通过事件命令而不是文本更改在 XAML 中使用源更新事件

关于c# - 更新绑定(bind)源后如何执行 ICommand?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660123/

相关文章:

c# - 部分线程安全的字典

c# 和 LINQ,其中集合成员的属性名称是通过函数传递的

ios - MonoTouch 中的 AesCryptoServiceProvider

c# - 如何与 Entity Framework Code First 建立一对一关系

.net - 在 ComboBox 中以不同方式显示所选项目

wpf - 如何更新uid

C# 播放嵌入的mp3文件

c# - 类型为 'LinkButton' 的控件 xxx 必须放置在带有 runat=server 的表单标记内

c# - 2 个相同的绑定(bind)......一个有效,另一个无效

c# - 单击带有符号图标的事件