wpf комбинирано поле с квадратче за отметка - избран елемент

Имам просто ComboBox с квадратчета за отметка като елементи. Как мога да предотвратя действителния избор на артикулите. Потребителят трябва да може само да поставя или премахва отметки в квадратчетата?

В момента, ако щракна върху елемент (не върху съдържанието или самата проверка), той става избран. Проблемът с това е: TextProperty на ComboBox е обвързано със стойност, която показва имената на маркираните елементи. Но ако един ComboBoxItem бъде избран, показваният текст става стойността на ViewModel на избрания елемент.

Благодаря предварително за всяко предложение.


person Daniel Bişar    schedule 28.06.2011    source източник


Отговори (2)


Какво ще кажете, ако промените своя ComboBox на ItemsControl:

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

Наличието на ItemsControl вместо ComboBox ще покаже всички елементи само с възможност за отметка.

person WaltiD    schedule 28.06.2011
comment
Причината да използвам комбинирания списък е, че нямам толкова много място в тази област, където го използвам. Ако използвах itemcontrol, нямаше да имам възможността да изскача квадратчетата за отметка. Използването на Expander също не е задоволително. - person Daniel Bişar; 28.06.2011
comment
Така че можете да промените външния вид на стила на селекцията. Вижте този въпрос - person WaltiD; 28.06.2011

Добре, вече опитах преди да използвам GetBindingExpression(...).UpdateTarget(), защото моят TextProperty е обвързан, но нищо не се случи. Тази функция ще има ефект само след актуализиране на оформлението. Така че резултатът:

/// <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;
    }
}
person Daniel Bişar    schedule 28.06.2011