Я знаю, что это старая проблема, но это решение может помочь кому-то еще.
Вместо использования ConvertBack
метода IMultiValueConverter
вы можете установить для привязки IsChecked
значение OneWay
и использовать свойство CheckBox
Command
для выполнения логики проверки.
<ListBox.ItemTemplate>
<HierarchicalDataTemplate>
<CheckBox Content="{Binding Path=.}" Command="{Binding Path=CheckBoxCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding Path=.}">
<CheckBox.IsChecked>
<MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}" Mode="OneWay">
<Binding Path="." />
<Binding Path="SelectedItems" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
Затем добавьте CheckBoxCommand, который выполняет что-то похожее на это:
// the items bound to your checkbox
public Collection<string> Items { get; set; }
// the list of selected items
public Collection<string> SelectedItems { get; set; }
private void ExecuteCheckBoxCommand(string obj)
{
SelectedItems.Add(obj);
}
Я знаю, что это немного приблизительный способ сделать это, но метод IMultiValueConverter.ConvertBack
на самом деле совершенно бесполезен - я не могу представить его слишком много, не имея доступа к текущим значениям привязки.