更新实体框架导航属性ICollection项

时间:2016-03-28 15:48:56

标签: c# wpf entity-framework checkbox mvvm

我在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);

1 个答案:

答案 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的框后,以便将更改保存到数据库中。