页面导航后 WPF MVVM 数据绑定中断

     2023-04-13     258

关键词:

【中文标题】页面导航后 WPF MVVM 数据绑定中断【英文标题】:WPF MVVM data binding broken after page navigation 【发布时间】:2011-04-07 02:51:31 【问题描述】:

我在 WPF 导航样式应用程序中有一个页面,用于显示搜索结果。该页面包含几个数据绑定控件。页面本身工作正常;它执行搜索并返回结果。数据绑定的 CheckBox 控件正常工作。

但如果我单击结果链接,然后单击返回按钮返回结果列表,我的所有CheckBox.IsChecked 数据绑定都将被破坏。其他数据绑定控件(ComboBoxes、DatePickers 等)继续按预期工作。绑定到 CheckBox 控件上的其他属性(如 IsEnabled)可以正常工作。但在我刷新页面之前,IsChecked 绑定仍然断开。

这是用于我的 CheckBox 控件之一的 XAML:

<CheckBox IsChecked="Binding IncludeNote" Content="Note" IsEnabled="Binding IsBusy, Converter=StaticResource boolNot" />

如您所见,这里没有什么特别之处。但是在 WPF 应用程序向前或向后导航到页面后,IsChecked 绑定将被破坏,而IsEnabled 属性将继续工作。

这里发生了什么?这是一个错误吗?

更新:在尝试了一些替代方案后,我发现这个问题也会影响到 CheckBox 派生的 ToggleButton 控件。

UPDATE2: TextBox.Text 属性也损坏了。

有没有办法“刷新”这些控件的数据绑定?还是应该采取其他方法来解决此问题?

【问题讨论】:

【参考方案1】:

显然,它一个错误。这是关于 Microsoft Connect 的错误报告: Binding does not work after back / forward navigation.

报告错误的用户RQDQ也提到了他处理问题的方法:

我发现的解决方法是在 Loaded 事件期间为页面中的所有绑定手动调用 BindingOperations.SetBinding。无论是显式导航还是通过历史记录(后退/前进操作),这似乎都有效。

这只是 WPF4 中的一个问题。数据绑定在 .NET 3.5 中按预期工作。

我希望微软能尽快解决这个问题。对于导航风格的 WPF 应用程序来说,这是一个严重的问题。

【讨论】:

【参考方案2】:

一个简单的解决方法是将 KeepAlive 设置为 true,然后确保 VIewModel 在前一页加载时状态不佳,每次在 Loaded 事件中将 DataContext 设置为一个新实例(即不绑定到您的 Page.Resources 字典中的 ViewModel 实例,例如,因为它将被持久化)。

我们用于将页面绑定到视图模型的标准方法是将简单的行为附加到页面。

public sealed class PageViewModelBehavior : Behavior<Page>

    public Type DataType  get; set; 

    protected override void OnAttached()
    
        this.AssociatedObject.KeepAlive = true;
        this.AssociatedObject.Loaded += this.AssociatedObjectLoaded;
        this.AssociatedObject.Unloaded += this.AssociatedObjectUnloaded;
        base.OnAttached();
    

    protected override void OnDetaching()
    
        this.AssociatedObject.Unloaded -= this.AssociatedObjectUnloaded;
        this.AssociatedObject.Loaded -= this.AssociatedObjectLoaded;
        base.OnDetaching();
    

    private void AssociatedObjectLoaded(object sender, RoutedEventArgs e)
    
        if (this.DataType == null || !typeof(IPageViewModel).IsAssignableFrom(this.DataType))
        
            throw new InvalidOperationException("PageViewModelBehavior.DataType is not set. Page: " + this.AssociatedObject.GetType().Name);
        

        this.AssociatedObject.DataContext = Activator.CreateInstance(this.DataType);

        // TODO: Call load on your page view model etc.
    


    private void AssociatedObjectUnloaded(object sender, RoutedEventArgs e)
    
        // TODO: Call unload on your page view model etc.

        // Allow the throw-away view model to be GC'd
        this.AssociatedObject.DataContext = null;
    

这可确保每次用户导航回页面时再次绑定页面。这也允许您使用自己喜欢的 IOC 容器来创建 ViewModel。

【讨论】:

这里最大的问题是它会很快导致内存泄漏。

wpf,mvvm,在combobox中嵌套了checkbox控件,数据绑定完成后,无法实现双向绑定

在页面上勾选checkbox后,但是vm层的数据不会跟着改变,为什么。vm层的数据可以在页面正确显示,是单向的。xaml代码:<ComboBoxHeight="23"HorizontalAlignment="Left"Grid.Column="0"Grid.Row="0"Margin="15,4,6,4"... 查看详情

在 WPF MVVM Light 中多次绑定到 RelayCommand

...题描述】:我已经开始使用WPFMVVMLight,现在我正在尝试在页面之间导航。在主窗口中我添加了一个“BackButton”<ButtonCommand=\'BindingMain.GoBack,Mode=OneW 查看详情

我们一起写框架mvvm的wpf框架之绑定

MVVM的特点之一是实现数据同步,即,前台页面修改了数据,后台的数据会同步更新。上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体。那么现在就要开始实现数据同步了。DataContext—数据上下... 查看详情

如何在 MVVM 模式中从页面导航到 WPF 中的页面?没有棱镜的概念[重复]

】如何在MVVM模式中从页面导航到WPF中的页面?没有棱镜的概念[重复]【英文标题】:HowtodonavigationfrompagestopagesinWPFinMVVMpattern?withouttheconceptofprism[duplicate]【发布时间】:2015-08-3119:39:24【问题描述】:目前我正在开发一个有这么多页... 查看详情

WPF MVVM 数据绑定问题

】WPFMVVM数据绑定问题【英文标题】:WPFMVVMDataBindingissue【发布时间】:2013-02-1522:52:39【问题描述】:有人可以解释为什么在使用以下代码实现的WPF扩展控件“BusyIndi​​cator”中未使用在CodeBehind中分配的ViewModel:ViewModel实现:publ... 查看详情

wpf中mvvm子窗口修改数据问题

WPF中用MVVM模式,有两个窗口,父窗口是数据列表,子窗口为修改窗口,子窗口的文本框数据变化了父窗口也跟这变化了,这是怎么回事啊?还没点击确定按钮这么说吧,wpf里的数据绑定就是给数据源(source)和显示数据的绑定... 查看详情

note7:mvvm模式之数据绑定

...源说明(1)本文参考自:一步步走进WPF的MVVM模式(二):数据绑定WPF之数据绑定总结 二、正文 数据绑定 (DataBinding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱。 简而言之,数据绑定就是将两... 查看详情

mvvm设计模式和在wpf中的实现事件绑定

...现(一)MVVM模式简介MVVM模式解析和在WPF中的实现(二)数据绑定MVVM模式解析和在WPF中的实现(三)命令绑定MVVM模式解析和在WPF中的实现(四)事件绑定MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信 MVVM模式解析和... 查看详情

2021-09-29wpf上位机50-mvvm模式数据绑定(代码片段)

MVVM模式中的基本内容绑定1、数据绑定:依赖属性:数据Model必须继承DependencyObject属性名称+Changed事件:固定写法INotifyPropertyChanged接口:形成一种契约2、基于Model的数据验证ExceptionRequired、StringLength、Range、RegularExpression、CustomMode... 查看详情

wpf原生绑定和命令功能使用指南(代码片段)

...绑定和命令的风采。 一、绑定的使用 目标:前台页面通过绑定获取后台属性的值。这个目标实际上分为两部分,一是前台获取后台的属性值,二是属性值变动后能够及时体现出来。要实现目标的第一部分,实际只需在窗... 查看详情

绑定到两个不同视图的数据源。mvvm,wpf(代码片段)

...我正在做的是尝试从两个不同的视图绑定到ModelRevisionList数据源。我将我的视图的数据上下文设置为 查看详情

MVVM WPF - Viewmodel 命令绑定

...的datacontext设置为xaml中的不同视图模型。主窗口还附加到数据上下文中的不同视图模型。主窗口有三个按钮,应该通过命令绑定来绑定,如何通过xaml将主窗口按钮绑定到对应的use 查看详情

如何在没有数据模板的情况下在 wpf mvvm 中导航用户控件视图?

】如何在没有数据模板的情况下在wpfmvvm中导航用户控件视图?【英文标题】:Howtonavigateusercontrolsviewinwpfmvvmwithoutdatatemplate?【发布时间】:2018-08-2808:09:01【问题描述】:我是wpf的新手。所以我决定为自己制作一些基本的mvvmwpf应用... 查看详情

WPF:如何使用 MVVM 将命令绑定到 ListBoxItem?

...,我创建的是几个文本框,用户可以在其中添加他或她的数据,一个用于保存该 查看详情

无法使用 MVVM 将 WPF ChartPlotter 绑定到视图

...使用MVVM创建了一个简单的图表绘图仪。但是我无法绑定数据源Outputimage。XAML<Windowxmlns="http://schemas.microsoft.com/w 查看详情

WPF MVVM 将 ComboBox 绑定到 Datagrid 选定项

...错了。任何帮助,将不胜感激。我将组合框所在的网格的数据上下文设置为数据 查看详情

MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活

】MVVMWPFComboBoxSelectedItem绑定未在数据网格内激活【英文标题】:MVVMWPFComboBoxSelectedItemBindingnotactivatedinsidedatagrid【发布时间】:2013-08-3016:29:05【问题描述】:在数据网格中操作时,我一直在努力保存我的组合框选定值。当我制作没... 查看详情

WPF、MVVM、导航、保持依赖注入完整

】WPF、MVVM、导航、保持依赖注入完整【英文标题】:WPF,MVVM,Navigation,KeepingDependencyInjectionIn-Tact【发布时间】:2015-10-2215:53:06【问题描述】:我有一个简单的WPF应用程序,它利用Unity框架进行依赖注入。目前,我正在尝试简化我在M... 查看详情