2
votes

I have a simple ComboBox with CheckBoxes as Items. How can I prevent the actual selection of the items. The user should only be able to check or uncheck the checkboxes?

Currently if I click on an element (not on the content or the check itself) it becomes selected. The problem with this is: The TextProperty of the ComboBox is bound to a value which displays the names of the checked items. But if one ComboBoxItem becomes selected the displayed text becomes the value of the ViewModel of the selected item.

Thanks in advance for any suggestion.

2

2 Answers

2
votes

What about if you change your ComboBox to ItemsControl:

<ItemsControl ItemsSource="{Binding Path= Items}">
  <ItemsControl.ItemTemplate>  
    <DataTemplate>  
      <CheckBox IsChecked="{Binding Checked}" Content="{Binding Name}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl> 

Having an ItemsControl instead of a ComboBox will display all the items only checkable.

1
votes

Ok, I already tried before to use GetBindingExpression(...).UpdateTarget() because my TextProperty is bound but nothing happend. This function will only have an effect after the layout was updated. So the result:

/// <summary>
/// Prevents the selection of an item and displays the result of the TextProperty-Binding
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SeveritiesComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox box = sender as ComboBox;

    if (box == null)
        return;

    if (box.SelectedItem != null)
    {
        box.SelectedItem = null;

        EventHandler layoutUpdated = null;

        layoutUpdated = new EventHandler((o, ev) =>
        {
            box.GetBindingExpression(ComboBox.TextProperty).UpdateTarget();
            box.LayoutUpdated -= layoutUpdated;
        });

        box.LayoutUpdated += layoutUpdated;
    }
}