c# - 将标志枚举绑定(bind)到包含复选框的列表框

标签 c# wpf listbox wpf-controls itemscontrol

我有标志枚举说这个 -

[Flags]
public enum Department
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

我想在 View 中显示此枚举的值。我想创建一个列表框并将其源绑定(bind)到此枚举的集合 List<Department> Departments . 一切都很好,直到我想到有一个复选框绑定(bind)到我的 Viewmodel 上的属性 -

public Department SelectedDepartments { get; set; }

这里的解决方案http://compilewith.net/2008/12/wpf-flagsenumvalueconverter.html为将枚举值绑定(bind)到复选框提供了优雅的解决方案,但它有一个限制,即创建的复选框等于列表中枚举值的数量。 但是,就我而言,我无法承受在我的 UI 上放置这么多复选框,因为我的 Enum 包含 20 个值(这意味着在 UI 上有 20 个复选框)。

我尝试使用 MultiBindingConverter但在 ConvertBack 中失败了方法。 我想将复选框的状态与属性 SelectedDepartments 绑定(bind)。假设属性值为“A | B”,则应选中 A 和 B 复选框,而 C 和 D 应保持未选中状态。

最佳答案

我不认为有一种方法可以在不使用一些代码隐藏的情况下做到这一点。

我采用了上面链接的示例解决方案,从 MainWindow.xaml 中删除了所有复选框,将以下方法添加到 MainWindow.xaml.cs 并从 MainWindow 调用它构造函数:

    private void AddCheckBoxes()
    {
        var converter = new FlagsEnumValueConverter();
        foreach (Department dept in Enum.GetValues(typeof(Department)))
        {
            if (dept != Department.None)
            {
                var binding = new Binding()
                {
                    Path = new PropertyPath("Department"),
                    Converter = converter,
                    ConverterParameter = dept
                };

                var checkBox = new CheckBox() { Content = dept.ToString() };
                checkBox.SetBinding(CheckBox.IsCheckedProperty, binding);
                DepartmentsPanel.Children.Add(checkBox);
            }
        }
    }

此方法完成了创建所有复选框的工作,除了 None 之外,每个命名枚举常量对应一个复选框。 .然后我可以将更多部门添加到 Department枚举,重新运行解决方案并查看新添加部门的其他复选框。

我还必须对该解决方案进行一些小的更改才能使其完全正常工作。您可能需要也可能不需要对代码进行这些更改。首先,我做了 DataObject类(class)工具INotifyPropertyChanged .其次,我将MainWindow.xaml中的XAML重写如下:

<StackPanel>
    <StackPanel x:Name="DepartmentsPanel" />
    <TextBlock Margin="5,20,0,0">
        <TextBlock Text="Raw Value:" FontWeight="Bold" />
        <TextBlock Text="{Binding Department}" />
    </TextBlock>
</StackPanel>

(基本上,我将现有的 DepartmentsPanel 包装在另一个 StackPanel 中,并将“原始值”显示移动到这个外部 StackPanel 中。)最后,我设置了整个 MainWindow 的 DataContext,而不是 DepartmentsPanel 的 DataContext。 , 至 DataObject创建。此步骤是使“原始值”显示正常工作所必需的。

关于c# - 将标志枚举绑定(bind)到包含复选框的列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10061886/

相关文章:

c# - "if"语句中复合 bool 表达式的运算顺序是什么

c# - 调试期间的 Visual Studio : The function evaluation requires all threads to run

c# - 为什么我从 Clipboard 类收到 OutOfMemoryException 异常?

wpf - 如何将扩展器锚定到列表框的右侧?

在 2 个循环内访问单元格值时出现 VBA 错误 '1004'

c# - 在异步方法上调用 .Wait() 和 Task.Run().Wait() 之间的区别

c# - 使用 C# 通过 HTTP POST 发送文件

c# - 如何使用子字符串删除字符串结尾(文件名)?

wpf - 取消在WPF中关闭窗口

python-3.x - Tkinter 列表框 "update"或 "refresh"