假设我有一个 WPF TextBox
:
<TextBox Text="{Binding Foo}" />
在属性 Foo
被 TextBox
更新后,是否有办法执行一些 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/