C# 在*到达视图模型之前拦截UI更改*

C# 在*到达视图模型之前拦截UI更改*,c#,wpf,mvvm,combobox,C#,Wpf,Mvvm,Combobox,问题:在UI中的更改进入视图模型之前,是否有任何方法可以拦截该更改?具体地说,我需要一些能与组合框一起工作的东西。有很多方法可以检测UI中的某些内容已更改,然后通过将其更改回(例如:、或)来“取消”,但这些方法都有以下两个缺点之一: 底层模型被更改,然后又更改回来,而不是真正取消更改 取消发生在视图模型中,因此用于取消的UI也必须进入视图模型中 背景:我有一个带有组合框的表单和一些Foos。用户应该可以自由更改所选的Foo(一旦用户选择了Foo,他们就不应该被锁定以保留它),但是更改所选的Foo

问题:在UI中的更改进入视图模型之前,是否有任何方法可以拦截该更改?具体地说,我需要一些能与
组合框一起工作的东西。有很多方法可以检测UI中的某些内容已更改,然后通过将其更改回(例如:、或)来“取消”,但这些方法都有以下两个缺点之一:

  • 底层模型被更改,然后又更改回来,而不是真正取消更改
  • 取消发生在视图模型中,因此用于取消的UI也必须进入视图模型中
  • 背景:我有一个带有
    组合框的表单
    和一些
    Foos
    。用户应该可以自由更改所选的
    Foo
    (一旦用户选择了
    Foo
    ,他们就不应该被锁定以保留它),但是更改所选的
    Foo
    可能会使用户选择的视图模型中的某些其他设置无效。用户将收到一些警告,可能是一个消息框,说“您确定要更改Foo吗?”,选择不更改
    Foo
    应该取消更改。更改所选
    Foo
    的值,然后再将其更改回来的问题在于,决定哪些内容需要无效的逻辑应该连接到设置VM backing属性中(可能是
    NotifyPropertyChanged(Foo)
    或其旁边)因此,无论更改是否取消,其他设置都会失效

    解决我问题的正交问题:

  • 我是否试图以一种不应该弯曲的方式弯曲MVVM范式?我是否应该寻找一种将取消UI移动到UI并将取消行为保留在视图模型中的方法
  • “先换后换不起作用”的说法不准确吗?在发生回变之后,是否有什么地方可以钩住,然后启动(或抑制)失效

  • Noone说视图模型必须立即将每个更改转发到模型


    我会从视图模型中触发“您真的想更改此项吗?”对话框,如果用户回答“是”,则更改模型(并在必要时使其他属性无效),否则将恢复视图模型中的更改,不使任何内容无效

    看来我对这个问题还不太清楚。无效发生在ViewModel中(因此UI会被删除的无效设置更新)。模型只有在从表单中删除时才写入有效设置。我将更新这个问题,看起来我也不是很清楚-如果视图模型中的绑定属性无效,那么没有问题。当用户选择取消编辑时,视图模型可以恢复该数据,因为它仍在模型中。只需延迟模型中的更改,直到用户单击ok。