MVVM 和异步属性

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 属性的推荐方法是什么?还是根本不可能?

Ste*_*ary 5

包含对我想要异步的方法的调用。

我有一篇关于异步 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然后TaskNotifyTask. 这是同步完成的,因此可以在属性设置器中执行此操作。

然后,您的数据绑定也需要更新。NotifyTask<T>有几个可以使用的属性。最明显的是Result,它最终将保存 的结果EmployeeHolidayAllowanceAsync(它返回默认值直到EmployeeHolidayAllowanceAsync完成)。还有IsNotCompletedIsFaulted,您需要使用它来向用户指示数据尚未到达或存在一些错误。