Stu*_*art 3 c# wpf mvvm async-await
我有一个具有以下属性的 ViewModel
public Employee SelectedEmployee
{
get { return _selectedEmployee; }
set
{
if (value == _selectedEmployee) return;
_selectedEmployee = value;
if (_selectedEmployee != null)
{
StaffHolidaysViewModel.HolidayAllowance = _staffDataService.EmployeeHolidayAllowance(_selectedEmployee.Id);
FireEmployeeSelectedMessage(SelectedEmployee.Id);
}
RaisePropertyChanged();
RaisePropertyChanged(nameof(Allowance));
RaisePropertyChanged(nameof(Taken));
RaisePropertyChanged(nameof(Remaining));
RaisePropertyChanged(nameof(TotalAbsences));
RaisePropertyChanged(nameof(TotalSick));
RaisePropertyChanged(nameof(TotalNonSickAbsences));
RaisePropertyChanged(nameof(SelectedEmployeeLeavingDate));
UpdateCanExecuteChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
线路
StaffHolidaysViewModel.HolidayAllowance = _staffDataService.EmployeeHolidayAllowance(_selectedEmployee.Id);
Run Code Online (Sandbox Code Playgroud)
包含对我想要异步的方法的调用。我不知道如何执行此操作,因为 SelectedEmployee 是绑定属性。
<ComboBox Name="StaffMembers" ItemsSource="{Binding FilteredEmployees}" SelectedItem="{Binding SelectedEmployee}" Width="200" BorderThickness="1" BorderBrush="DimGray">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
由于它是一个属性,所以我无法创建它的类型Task<Employee>
异步绑定 MVVM 属性的推荐方法是什么?还是根本不可能?
包含对我想要异步的方法的调用。
我有一篇关于异步 MVVM 数据绑定的文章。本质上,我通常做的就是创建一个可绑定的数据- 我在文章中Task称之为,简称为在我更新的库中。NotifyTaskCompletionNotifyTask
您可以通过将 的类型StaffHolidaysViewModel.HolidayAllowance从任何类型(我称之为THolidayAllowance)更改为NotifyTask<T>包装器(例如,NotifyTask<THolidayAllowance>)来使用它。
然后,您可以同步设置它:
StaffHolidaysViewModel.HolidayAllowance = NotifyTask.Create(
_staffDataService.EmployeeHolidayAllowanceAsync(_selectedEmployee.Id));
Run Code Online (Sandbox Code Playgroud)
您在这里所做的就是开始 EmployeeHolidayAllowanceAsync然后Task用NotifyTask. 这是同步完成的,因此可以在属性设置器中执行此操作。
然后,您的数据绑定也需要更新。NotifyTask<T>有几个可以使用的属性。最明显的是Result,它最终将保存 的结果EmployeeHolidayAllowanceAsync(它返回默认值直到EmployeeHolidayAllowanceAsync完成)。还有IsNotCompleted和IsFaulted,您需要使用它来向用户指示数据尚未到达或存在一些错误。
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |