视图模型更新时视图不更新

Posted

技术标签:

【中文标题】视图模型更新时视图不更新【英文标题】:View is not updating when view model updates 【发布时间】:2020-03-23 08:03:17 【问题描述】:

我已经被这个问题困扰了一段时间,我的视图模型没有更新视图。当我调试时,视图模型正在更新,但它没有显示在视图中。我做错了什么?

这是我的看法:

    <ContentPage.BindingContext>
        <viewModels:SalaryViewModel/>
    </ContentPage.BindingContext>
                    <Label Text="Binding sYear" Grid.Row="2" Grid.Column="1" />
                    <Label Text="Binding sTransportation" Grid.Row="3" Grid.Column="0" />
                    <Label Text="Binding sMonth" Grid.Row="3" Grid.Column="1" />
                    <Label Text="Binding sBasicSalary" Grid.Row="3" Grid.Column="1" />

当我运行 Debug.WriteLine 时,值会显示在 Visual Studio 的输出面板上。只有视图没有获得更新的值。下面是 SalaryViewModel


 class SalaryViewModel : INotifyPropertyChanged
    
        public event PropertyChangedEventHandler PropertyChanged;
        private ApiServices _apiServices = new ApiServices();
        private string year;
        private string month;
        private string BasicSalary;
        private string Transportation;

        public string sYear
        
            get  return year; 
            set
            
                if (year == value)
                    return;
                year = value;
                onPropertyChanged(nameof(sYear));
            
        
        public string sMonth
        
            get => month;
            set
            
                if (month == value)
                    return;
                month = value;
                onPropertyChanged(nameof(sMonth));
            
        
        public string sBasicSalary
        
            get =>BasicSalary;
            set
            
                if (BasicSalary == value)
                    return;
                BasicSalary = value;
                onPropertyChanged(nameof(sBasicSalary));
            
        
        public string sTransportation
        
            get => Transportation;
            set
            
                if (Transportation == value)
                    return;
                Transportation = value;
                onPropertyChanged(nameof(sTransportation));
            
        


        public ICommand SalaryCommand
        
            get
            
                return new Command(async () =>
                
                    string currentMonth = DateTime.Now.Month.ToString();
                    string currentYear = DateTime.Now.Year.ToString();
                    await _apiServices.FetchSalary(currentYear , currentMonth );
                );
            
        
        private void onPropertyChanged(string pName)
        
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pName));

        

    

【问题讨论】:

您没有更新此代码中的任何值?如果您希望视图具有更新的值,您需要设置属性的值。 所以我应该在 await _apiServices 行中包含这些值? 【参考方案1】:

您好,我确实看到您调用了“sBasicSalary”的“set”方法。怎么做 在调用“await”后设置 sBasicSalary 的值 _apiServices.FetchSalary(currentYear , currentMonth );"?

【讨论】:

我是这个视图模型的新手,我想我弄错了。我的 FetchSalary 函数中包含了这个: SalaryViewModel svm = new SalaryViewModel();为了更改视图模型中的值,我这样做了: svm.sBasicSalary = "Basic Salary: value";这是错误的做法吗? 我想在 await 行中包含所有值并将它们全部包含在 FetchSalary 函数中吗? 我认为你不应该调用这个语句:“SalaryViewModel svm = new SalaryViewModel();”,你应该在“FetchSalary”中传递 SalaryViewModel 的实例。例如等待 apiServices.FetchSalary(this); 如果我删除该行,其余的值将不会在视图模型中更新,并会导致 FetchSalary 函数中不存在该变量的错误,但我会尝试输入await 行中的所有值(当前年份和月份除外),然后编辑我的 FetchSalary 函数。 例如等待 apiServices.FetchSalary(this,currentYear, currentMonth);你在 ApiServices 中的 FetchSalary 函数: public Task FetchSalary(SalaryViewModel svm,string currentYear,string currentMonth)svm.sBasicSalary = "Basic Salary: value";

以上是关于视图模型更新时视图不更新的主要内容,如果未能解决你的问题,请参考以下文章

视图模型应该对视图控制器中的事件做出反应吗?

更新视图模型,发布对象,属性更新时

SwiftUI MVVM:父视图更新时重新初始化子视图模型

ListBoxFor 未在提交时完全更新视图模型

Django:渲染视图后如何更新模型?

AngularJS 中的视图未更新