视图模型更新时视图不更新
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";以上是关于视图模型更新时视图不更新的主要内容,如果未能解决你的问题,请参考以下文章