Performance Mvvm-更新绑定花费的时间太长

Performance Mvvm-更新绑定花费的时间太长,performance,mvvm,binding,Performance,Mvvm,Binding,我有5个模型。每个视图都有自己的VM。启动程序时,ViewModel会更改绑定,即 private string _bruttolohn; public string Bruttolohn { get { return _bruttolohn; } set { if (value != null) { if (value != _bruttolohn) { _b

我有5个模型。每个视图都有自己的VM。启动程序时,ViewModel会更改绑定,即

private string _bruttolohn;
public string Bruttolohn
{
    get { return _bruttolohn; }
    set
    {
        if (value != null)
        {
            if (value != _bruttolohn)
            {
                _bruttolohn = value;
                Calculate();
                RaisePropertyChanged(() => Bruttolohn);
            }
        }


    }
}
Bruttolohn=我输入一些值来计算和设置新值。我还有大约100个其他属性,它们都使用绑定。如果我启动程序,计算很好,运行速度很快!但是当我更改视图时(所有视图都在ContentControl中。如果我单击一个按钮,视图将被更改为:MyContent.Content=new FirstView();)。现在的问题是:如果我更改视图30次,ViewModel需要太长的时间来设置绑定。为什么? +如果我进行调试,此时:

RaisePropertyChanged(() => Bruttolohn);

弹出错误:ObservableObject.cs丢失…?

您显示的代码没有问题,因此我怀疑计算方法有问题。配置它


如果Calculation()方法太长而无法发布,那么它不应该在属性设置器中:)

我想我找到了解决方案。每次单击按钮“FirstView”,ContentControl的内容都会得到一个新视图()!所以每次我点击按钮,它都会:

MyContent.Content = new FirstView(); 
这意味着在后台仍有一些视图处于打开状态。。。我自己无法解释,但如果我像

FirstView fw; 
在MainViewModel的构造函数中

fw = new FirstView();
我可以像这样轻松地分配ContentControl的内容(无需创建新视图):

您可以在此处下载测试应用程序: 它有一个主视图和两个视图。这说明了我的问题。如果单击按钮“FirstView”,contentcontrol的内容将是“FirstView.xaml”。它有两个文本框,用于计算总和,并有一个for循环(对于i=0,i<500,i++)。如果您一开始就计算,计算只需约1秒,但如果您单击“FirstView”按钮约30次,然后再次尝试计算,计算需要10秒以上!!!
我认为这是因为MyContent.Content=newfirstview();你可以检查我的程序,如果我错了就纠正我,如果我对了就说。。。正如我所说,我认为这是解决方案,但我不是100%确定。

(尝试坚持一个问题!)尝试从属性getter中删除计算。抱歉,是“属性setter”如果绑定是双向的,则视图会设置属性并多次调用Calculate方法。当我更改该值时,该计算最多会被调用两次(因为它仅在失去焦点时才会被设置)。我只能在用户单击按钮时调用“Calculation()”,但它仍然让我恼火,为什么开始时的计算是“超快速的”,当我更改ContentControl的内容并再次尝试计算时,计算需要3秒以上的时间。你真的认为计算速度慢还是同时发生了其他事情(UI更新)你能发布计算方法吗?计算方法太长,无法发布到此处:/但是我现在看到,每次单击按钮将视图设置为我的contentcontrol(MyContent.Content=new FirstView();),设置它需要更长的时间。例如:我第一次单击它=>需要~0,3秒。当我在15次单击它时,设置contentcontrol的内容需要~5秒甚至更长的时间。编辑:它仍然是计算()这需要很长时间…是的,以前的视图仍然绑定到ViewModel,因此它们也在更新。这就是为什么许多MVVM框架使用某种缓存分发视图,以便它们得到回收,而一些框架使用WeakReference,以便垃圾回收器能够删除旧视图。K,谢谢!)几周后我完成了我的应用程序,然后这个。。。无论如何,谢谢你的帮助。
MyContent.Content = fw;