假设我有几个CheckBox,在ViewModel中有一个字符串列表。
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'}" />
这实际上可以使参数相应地从列表中添加和删除。但是,当我选中/取消选中复选框时,它们周围会出现红色边框,这绝对肯定表示不正确:
导致此错误的原因以及如何以正确的方式完成此任务?
目标属性(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;
}