首页 > 解决方案 > 将 WPF CheckBox.IsChecked 绑定到列表

问题描述

假设我有几个 CheckBox,在 ViewModel 中有一个字符串列表。

在此处输入图像描述

public List<string> Checks { get; set; }

我的目标是以这样的方式将我的复选框绑定到列表,当 Checkbox 1 被选中时,“Check 1”将被添加到列表中,当它被取消选中时,“Check 1”将被删除,依此类推每个 CheckBox .

我试图用 ValueConverter 做到这一点:

public class CheckBoxToListConverter : IValueConverter
{
    List<string> bound;
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bound = value as List<string>;

        if (bound.Contains(parameter.ToString()))
            return true;
        else
            return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool isChecked = (bool)value;

        if (isChecked)
        {
            bound.Add(parameter.ToString());
            return true;
        }
        else
        {
            bound.Remove(parameter.ToString());
            return false;
        }
    }
}

然后我对我的复选框进行了以下绑定:

<CheckBox Content="Check 1" IsChecked="{Binding Checks, Converter={StaticResource MyConverter}, ConverterParameter='Check 1'}" />
<CheckBox Content="Check 2" IsChecked="{Binding Checks, Converter={StaticResource MyConverter}, ConverterParameter='Check 2'}" />
<CheckBox Content="Check 3" IsChecked="{Binding Checks, Converter={StaticResource MyConverter}, ConverterParameter='Check 3'}" />
<CheckBox Content="Check 4" IsChecked="{Binding Checks, Converter={StaticResource MyConverter}, ConverterParameter='Check 4'}" />

这实际上有效,参数会相应地从列表中添加和删除。但是当我选中/取消选中复选框时,它们周围会出现红色边框,这绝对表明有些事情是不正确的:

在此处输入图像描述

是什么导致了这个错误,我怎样才能以正确的方式完成这个任务?

标签: c#wpfdata-binding

解决方案


目标属性 ( ChechBox.IsChecked) 具有bool?类型。源属性 ( Checks) 具有List<string> 类型。

Convert转换器返回方法,bool与IsChecked兼容。

ConvertBack应该返回List<string>

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    bool isChecked = (bool)value;

    if (isChecked)
    {
        bound.Add(parameter.ToString());
    }
    else
    {
        bound.Remove(parameter.ToString());
    }
    return bound;
}

推荐阅读