c# - MVVM 和异步属性

标签 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();
            }
        }

线

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然后包装它的 TaskNotifyTask .这是同步完成的,因此可以在属性 setter 中完成。

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

关于c# - MVVM 和异步属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44292041/

相关文章:

c# - 将 WPF 文本框设置为限制剪切、复制和粘贴

wpf - 为什么在 OneWay 模式下数据绑定(bind)会中断?

android - 如何捕获没有互联网异常错误?

c# - 如何在没有引用的情况下克隆通用 List<T>?

c# - 在 WPF DataGrid Row 中禁用焦点

c# - 首次加载窗口时隐藏 WPF 验证错误

javascript - 将 Controller 作为服务注入(inject) typescript /Angular ?

WPF单选按钮以奇怪的顺序触发转换器

c# - 你最喜欢的 VS 2008 快捷键是什么?

c# - 创建批量文件的算法