我有一个具有以下属性的 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();
}
}
线
StaffHolidaysViewModel.HolidayAllowance = _staffDataService.EmployeeHolidayAllowance(_selectedEmployee.Id);
包含对我想要异步化的方法的调用。我不知道我该怎么做,因为 SelectedEmployee 是一个绑定(bind)属性。
<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>
因为它是一个属性,所以我无法创建它的类型 Task<Employee>
异步绑定(bind) MVVM 属性的推荐方法是什么?还是根本不可能?
最佳答案
Contains a call to a method that I'd like to make asynchronous.
我在 async MVVM data binding 上有一篇文章.本质上,我通常做的是创建一个数据绑定(bind) Task
- 我称之为 NotifyTaskCompletion
在文章中,缩写为 NotifyTask
in my updated library .
您可以通过更改 StaffHolidaysViewModel.HolidayAllowance
的类型来使用它从它是什么(我称之为 THolidayAllowance
)到 NotifyTask<T>
包装器(例如 NotifyTask<THolidayAllowance>
)。
然后,你可以同步设置它:
StaffHolidaysViewModel.HolidayAllowance = NotifyTask.Create(
_staffDataService.EmployeeHolidayAllowanceAsync(_selectedEmployee.Id));
你在这里做的是开始 EmployeeHolidayAllowanceAsync
然后包装它的 Task
用NotifyTask
.这是同步完成的,因此可以在属性 setter 中完成。
然后,您的数据绑定(bind)也需要更新。 NotifyTask<T>
has several properties that you can use .最明显的是 Result
,最终将保存 EmployeeHolidayAllowanceAsync
的结果(它返回一个默认值,直到 EmployeeHolidayAllowanceAsync
完成)。还有 IsNotCompleted
和 IsFaulted
,您将要使用它来向用户指示数据尚未到达或存在一些错误。
关于c# - MVVM 和异步属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44292041/