我在Visual Studio 2015中使用Entity Framework 6来构建MVVM Light WPF应用程序。我需要将导航属性ICollection绑定到一些CheckBox控件。员工可以拥有0到最多3个EmployeeStatus实体,employeeID作为EmployeeStatus实体的密钥; EmployeeStatus在employeeStatusID的EmployeeStatusDescription表上有一个外键。 EmployeeStatusDescription提供状态代码的描述(例如“已存档”,“无效”,“暂停”)。每个EmployeeStatus对应一个EmployeeStatusDescription。
EmployeeStatus在Employee类中以这种方式定义:
public virtual ICollection<EmployeeStatu> EmployeeStatus { get; set; }
EmployeeStatusDescription在EmployeeStatus类中定义为:
public virtual EmployeeStatusDescription EmployeeStatusDescription { get; set; }
我想显示3个CheckBox控件,并将每个控件绑定到EmployeeStatus ICollection值的值。例如,如果员工的状态为“非活动”且用户检查该状态,则需要将其添加到EmployeeStatus集合中;如果用户取消选中该项,我想将其从EmployeeStatus集合中删除。
我创建了以下StackPanel来保存复选框;它们与我的视图模型中的属性绑定:
<StackPanel Grid.Row="12"
Grid.Column="1"
Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Inactive" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeInActive}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Leave of Absence" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeLoa}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Archived" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeArchived}" />
</StackPanel>
</StackPanel>
这是绑定到其中一个CheckBox控件'IsChecked
依赖项属性的示例属性:
private bool _isSelectedEmployeeInActive;
public bool IsSelectedEmployeeInActive
{
get { return _isSelectedEmployeeInActive; }
set
{
if (_isSelectedEmployeeInActive == value) return;
_isSelectedEmployeeInActive = value;
RaisePropertyChanged(() => IsSelectedEmployeeInActive);
}
}
我正在搜索获取实体集合:
var query = (from e in Context.Employees
.Include("EmployeeStatus.EmployeeStatusDescription")
.Where(comparison)
select e);
SearchResults = new ObservableCollection<Employee>(query);
答案 0 :(得分:1)
在您的属性中,我还会从集合中添加/删除。如果您还没有,请将选定的员工存储在某处,以便您可以访问它。
if (_isSelectedEmployeeInActive == value) return;
_isSelectedEmployeeInActive = value;
//do updates to collection here
if (value)
{
SelectedEmployee.EmployeeStatus.Add(new EmployeeStatus("Inactive"));
}
else
{
SelectedEmployee.EmployeeStatus.Remove("Inactive"));
}
RaisePropertyChanged(() => IsSelectedEmployeeInActive);
我不确定您的员工状态如何,但您明白了。 只需确保在您完成检查上下文中调用SaveChanges的框后,以便将更改保存到数据库中。