Привязка WPF CheckBox. Проверено в списке - PullRequest
0 голосов
/ 11 марта 2020

Допустим, у меня есть несколько CheckBox, и в ViewModel у меня есть список строк.

enter image description here

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

Моя цель - привязать мои флажки к списку таким образом, чтобы при установке флажка 1 «Проверка 1» выполнялась будет добавлен в список, и когда он будет снят, «Проверка 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'}" />

Это на самом деле работает параметры добавляются и удаляются из списка соответственно. Но когда я проверяю / убираю флажки, они получают красную рамку вокруг них, что наиболее определенно указывает на то, что что-то не так:

enter image description here

Что вызывает эту ошибку и как мне правильно решить эту задачу?

1 Ответ

1 голос
/ 11 марта 2020

Целевое свойство (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;
}
...