绑定WPF CheckBox。已检查到列表

问题描述 投票:-1回答:1

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

enter image description here

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

我的目标是以这种方式将我的复选框绑定到列表,即当复选框1被选中时,“ Check 1”将被添加到列表中,而当复选框未被选中时,“ Check 1”将被删除,以此类推。每个复选框。

我试图通过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;
        }
    }
}

然后我对我的CheckBoxes进行了以下绑定:

<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'}" />

这实际上可以使参数相应地从列表中添加和删除。但是,当我选中/取消选中复选框时,它们周围会出现红色边框,这绝对肯定表示不正确:

enter image description here

导致此错误的原因以及如何以正确的方式完成此任务?

c# wpf data-binding
1个回答
1
投票

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

转换器的[Convert方法返回与IsChecked兼容的bool

[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;
}
© www.soinside.com 2019 - 2024. All rights reserved.