【问题标题】:WPF MVVM prevent the binding on SelectedValue to change the value in some situationWPF MVVM 防止绑定 SelectedValue 在某些情况下更改值
【发布时间】:2012-05-10 21:44:57
【问题描述】:

我有一个带有 SelectedDocument 属性和 Documents 属性的视图模型。

UI 有一个自定义 ListView 控件,其中 ItemsSource 绑定到 Documents,SelectedValue 绑定到 viewmodel 上的 SelectedDocument。

现在,在某些情况下,在所选文档的设置器中的视图模型中,我需要提出一个对话服务消息来询问某些内容,如果取消,我需要阻止更改 SelectedDocument。

我可以这样做,但是当我不更改视图模型中的属性值时,我会导致 UI 和视图模型不同步。

这可能是因为当双向绑定更新源时调用了属性的设置器。

如何解决?

谢谢

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    您必须撤消更改,但不能直接在 Setter 中执行此操作,而必须按照 here 所述使用 Dispatcher。

    关于在 MVVM 中使用 Dispatcher,有很多关于使用 IDispatcher 接口的帖子,可以找到 hereherehere(查看 MEFedMVVM.Services.Contracts 命名空间)。您必须查看其中哪一种适合您。

    【讨论】:

    • 现在我正在使用调度程序,但这有副作用,例如在资源非常低的机器上快速导航意味着您实际上可以在两个调度程序操作发生之前两次更改所选项目。事后看“动画”还不止这些。
    • 感谢 Nathan Allen-Wagner 的 Dispatcher 解决方案 - 以及您,Shriek,发现它!
    【解决方案2】:

    我假设您使用的是 .Net 3.5?它是一个“已知问题”,在 .Net 4 中已更改(注意我说更改不一定固定!)

    这里有一篇关于更改的博客文章,它还指出了一些关于如何处理 3.5 中的问题的建议

    https://web.archive.org/web/20150925210516/https://karlshifflett.wordpress.com/2009/05/27/wpf-4-0-data-binding-change-great-feature/

    【讨论】:

    • 我使用的是 4.0,但不是用于 Text 属性。对于那个它有效。对于列表框的 SelectedValue/SelectedItem,我需要一些类似的东西。我需要防止列表框更改当前项。
    • 好的,我有一个附加属性,我在组合框上使用它来处理相同的问题。本质上,您将属性设置为 true ,从而将其订阅到选择更改事件。当引发选择更改事件时,它会检索 SelectedItem 的绑定并调用 UpdateTarget。喜欢的可以发代码
    【解决方案3】:

    如果对话框被取消,您应该调用 PropertyChange 事件。这样,UI 层将通过重置 SelectedDocument 来响应。

    【讨论】:

    • 这是我尝试的第一件事,但是我在属性设置器中所做的任何事情都不会被 UI 监听,可能是因为它当前处于更新视图模型的绑定过程中。也许这可能导致堆栈溢出所以它不在乎?!
    猜你喜欢
    • 2021-10-11
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多