C# MVVM-使用组合框设置datagrid包含标志枚举值

C# MVVM-使用组合框设置datagrid包含标志枚举值,c#,wpf,mvvm,binding,wpf-controls,C#,Wpf,Mvvm,Binding,Wpf Controls,如何绑定Combobox以使用复选框和标签标记枚举值 例如,我有周天数的标志枚举: [Flags] public enum WeekDays { None = 0, Sunday = 1, Monday = 2, Tuesday = 4, Wednesday = 8, Thursday = 16, Friday = 32, Saturday = 64 } 人员类别: public class Worker : ViewMo

如何绑定Combobox以使用复选框和标签标记枚举值

例如,我有周天数的标志枚举:

[Flags]
public enum WeekDays
{
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}
人员类别:

    public class Worker : ViewModelBase
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; RaisePropertyChanged(() => Name); }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; RaisePropertyChanged(() => Age); }
        }

        private WeekDays _workingDays;

        public WeekDays WorkingDays
        {
            get { return _workingDays; }
            set { _workingDays = value; RaisePropertyChanged(() => WorkingDays); }
        }
    }
和my ViewModel包含工作日和集合工作日的集合(带文本的枚举):

公共类VM:ViewModelBase { 公共虚拟机() { EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“Sunday”,BitEnum=WeekDays.Sunday}); EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“Monday”,BitEnum=WeekDays.Monday}); EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“星期二”,BitEnum=WeekDays.星期二}); EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“星期三”,BitEnum=WeekDays.星期三}); EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“星期四”,BitEnum=WeekDays.星期四}); 添加(新的WorkerNumWrapper(){Name=“Friday”,BitEnum=WeekDays.Friday}); EnumWrapperCollection.Add(新的WorkerNumWrapper(){Name=“Saturday”,BitEnum=WeekDays.Saturday}); 添加(new Worker(){Name=“Steve”,年龄=34岁,工作日=WeekDays.Sunday | WeekDays.Monday}); 添加(new Worker(){Name=“John”,年龄=52,工作日=工作日。星期三|工作日。星期五}); 选择worker=Workers.FirstOrDefault(); } 私有ObservableCollection_enumsWrapperCollection=新ObservableCollection(); 公共ObservableCollection EnumWrapperCollection { 获取{return\u enumsWrapperCollection;} 设置{u enumsWrapperCollection=value;} } 私有ObservableCollection_workers=新ObservableCollection(); 公职人员 { 获取{return\u workers;} 设置{u workers=value;} } 私人工人(u selectWorker);; 公共工作者 { 获取{return\u selectWorker;} 设置{u selectWorker=value;RaisePropertyChanged(()=>selectWorker);} } } 我的xmal窗口包含一个Worker数据网格和一个包含EnumWrapperCollection集合的workdays的组合框。带有组合框的每一行worker都需要包含所有的工作日,但只检查worker的“WorkingDays”。此外,我希望用户能够检查和取消检查工作日,并通过这样做来更改值

窗口应如下所示:


有什么想法吗?

您已经尝试过什么?我尝试创建一个组合框,其中所有值都是“EnumWrapperCollection”(星期日、星期一等)。ItemTemplate/DataTemplate是复选框和标签。标签设置为名称(星期日、星期一等),复选框由转换器设置,转换器获取已选择的值(工作者)和WorkerNumWrapper的位图,如果SelectWorker.WorkDays包含WorkerNumWrapper处的标志,则返回true,否则返回false。复选框中的转换将获得相同的值,并根据当前选择更改SelectedWorker.WorkDays。
public class VM : ViewModelBase
{
    public VM()
    {
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Sunday", BitEnum = WeekDays.Sunday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Monday", BitEnum = WeekDays.Monday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Tuesday", BitEnum = WeekDays.Tuesday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Wednesday", BitEnum = WeekDays.Wednesday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Thursday", BitEnum = WeekDays.Thursday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Friday", BitEnum = WeekDays.Friday });
        EnumWrapperCollection.Add(new WorkerEnumWrapper() { Name = "Saturday", BitEnum = WeekDays.Saturday });

        Workers.Add(new Worker() { Name = "Steve", Age = 34, WorkingDays = WeekDays.Sunday | WeekDays.Monday });
        Workers.Add(new Worker() { Name = "John", Age = 52, WorkingDays = WeekDays.Wednesday | WeekDays.Friday });

        SelectWorker = Workers.FirstOrDefault();
    }

    private ObservableCollection<WorkerEnumWrapper> _enumsWrapperCollection = new ObservableCollection<WorkerEnumWrapper>();

    public ObservableCollection<WorkerEnumWrapper> EnumWrapperCollection
    {
        get { return _enumsWrapperCollection; }
        set { _enumsWrapperCollection = value; }
    }


    private ObservableCollection<Worker> _workers = new ObservableCollection<Worker>();
    public ObservableCollection<Worker> Workers
    {
        get { return _workers; }
        set { _workers = value; }
    }

    private Worker _selectWorker;

    public Worker SelectWorker
    {
        get { return _selectWorker; }
        set { _selectWorker = value; RaisePropertyChanged(() => SelectWorker); }
    }
}