我的情况:有两个具有绑定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"/>
这很好用。现在,我为员工建立了搜索功能,可以在所有成本中心找到他们。如果找到一个,则需要以编程方式更改SelecedCostcentre和SelectedEmployee。
这不是在创造比赛条件吗?因为如果我设置该SelectedCostcentre属性将PropertyChanged触发并设置该Employees属性。
如何在没有比赛条件的情况下解决此问题?
相关分类