мой сценарий: есть два поля со списком со связанным свойством SelectedItem
. Первый список содержит центры затрат, а второй — сотрудников выбранного центра затрат.
Это означает, что если SelectedCostcentre
изменяется, INotifyPropertyChanged
увольняет и ищет всех сотрудников в МВЗ.
ViewModel:
public abstract class SelectEmployeeViewModel : ViewModelBase
{
protected readonly Plant plant;
public ObservableCollection<Costcentre> Costcentres { get; protected set; }
public Costcentre SelectedCostcentre { get; set; }
public ObservableCollection<Employee> Employees { get; protected set; }
public Employee SelectedEmployee { get; set; }
public bool CostcentresEnabled
{
get { return Costcentres != null && Costcentres.Any(); }
}
public bool EmployeesEnabled
{
get { return Employees != null && Employees.Any(); }
}
protected SelectEmployeeViewModel(Window window, Page page, Plant plant) : base(window, page)
{
this.plant = plant;
PropertyChanged += SelectEmployeeViewModel_PropertyChanged;
Costcentres = mainController.CostcentreDao.GetByPlant(plant);
}
private void SelectEmployeeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(SelectedCostcentre):
SetEmployees();
break;
}
}
private void SetEmployees()
{
if (SelectedCostcentre != null)
Employees = mainController.EmployeeDao.GetByCostcentre(SelectedCostcentre);
else
Employees = new ObservableCollection<Employee>();
}
}
Xaml:
<ComboBox
ItemsSource="{Binding Costcentres}"
SelectedItem="{Binding SelectedCostcentre}"
DisplayMemberPath="DisplayName"
HorizontalAlignment="Left"
IsEnabled="{Binding CostcentresEnabled}"
Margin="81,61,0,0" VerticalAlignment="Top" Width="213"/>
<ComboBox
ItemsSource="{Binding Employees}"
SelectedItem="{Binding SelectedEmployee}"
DisplayMemberPath="DisplayName"
IsEnabled="{Binding EmployeesEnabled}"
HorizontalAlignment="Left" Margin="81,88,0,0" VerticalAlignment="Top" Width="213"/>
Это прекрасно работает. Теперь я создаю функцию поиска сотрудников, которая может найти их во всех центрах затрат. Если я его нашел, мне нужно программно изменить SelecedCostcentre
и SelectedEmployee
.
Не создает ли это состояние гонки? Потому что, если я устанавливаю свойство SelectedCostcentre
, PropertyChanged
срабатывает и устанавливает свойство Employees
.
private void SetEmployee(Employee employee)
{
SelectedCostcentre = Costcentres.Single(x => x.Id == employee.Costcentre.Id);
SelectedEmployee = Employees.Single(x => x.Id == employee.Id);
}
Как я могу решить эту проблему, не имея состояния гонки?
Спасибо