2017-02-17 3 views
2

У меня есть множественно выпадающий с CheckBox элементовКак растянуть флажок элемента полной ширины выпадающего списка

<ComboBox x:Name="cmb" IsEditable="True" IsReadOnly="True" DropDownClosed="cmb_DropDownClosed"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
      <CheckBox Content="{Binding NmColumn }" HorizontalAlignment="Stretch" 
         IsChecked="{Binding Path=bChecked, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
         Tag="{Binding IdColumn}" 
         /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

При нажатии на флажок все хорошо. Но если ширина флажка меньше ширины combobox, когда я нажимаю на правую сторону флажка, сводка закрывается. как переопределить это поведение?

ответ

2

Набор HorizontalContentAlignment для Stretch в ComboBox.ItemContainerStyle:

<ComboBox x:Name="cmb" IsEditable="True" IsReadOnly="True" DropDownClosed="cmb_DropDownClosed"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <CheckBox Content="{Binding NmColumn }" HorizontalAlignment="Stretch" 
        IsChecked="{Binding Path=bChecked, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
        Tag="{Binding IdColumn}" 
        /> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ComboBoxItem}"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
    </ComboBox> 
+0

Я просто понимаю, что Ориентация = «Горизонтальная» была опечаткой от копирования, вставляющего ваш код. Он должен быть вертикальным. Прости – Ron

0

Ответ на Рамин частично хорошо. Вы также должны удалить <StackPanel Orientation="Horizontal"> из своего шаблона данных. Это он, который ограничивает ваш флажок, расширяя всю ширину ComboboxItem.

<ComboBox x:Name="cmb" IsEditable="True" IsReadOnly="True" DropDownClosed="cmb_DropDownClosed"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 

       <CheckBox Content="{Binding NmColumn }" HorizontalAlignment="Stretch" 
       IsChecked="{Binding Path=bChecked, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
       Tag="{Binding IdColumn}" 
       /> 

     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 
0

Все ответы не сработали для меня. Что сделал Trick садилось

HorizontalContentAlignment = "Stretch"

для CheckBox:

<ComboBox x:Name="combobox" 
    Background="White" 
    Padding="2" 
    Text="{Binding ElementName=DockPanelTemplateComboCheck, Path=ComboTextFilter}" 
    IsEditable="True" 
    IsReadOnly="True" 
    HorizontalAlignment="Stretch" 
    ItemsSource="{Binding ...}" 
    IsDropDownOpen="{Binding Path=DropOpen, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, UpdateSourceTrigger=PropertyChanged}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Eintrag}" HorizontalContentAlignment="Stretch" Checked="CheckBox_Checked_Unchecked" Unchecked="CheckBox_Checked_Unchecked"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

CodeBehind:

private string combotextfilter = "<No Selection>"; 

    public string ComboTextFilter 
    { 
     get { return combotextfilter; } 
     set 
     { 
      if (value != null && value.IndexOf("ComboModel") != -1) return; 
      combotextfilter = value; 
      NotifyPropertyChanged(nameof(ComboTextFilter)); 
     } 
    } 

    private void CheckBox_Checked_Unchecked(object sender, RoutedEventArgs e) 
    { 
     switch (((ObservableCollection<ComboModel>)combobox.ItemsSource).Count(x => x.IsChecked)) 
     { 
      case 0: 
       ComboTextFilter = "<No Selection>"; 
       break; 
      case 1: 
       ComboTextFilter = ((ObservableCollection<ComboModel>)combobox.ItemsSource).Where(x => x.IsChecked).First().Eintrag; 
       break; 
      default: 
       ComboTextFilter = ((ObservableCollection<ComboModel>)combobox.ItemsSource).Where(x => x.IsChecked).Select(x => x.Eintrag).Aggregate((i, j) => i + " | " + j); 
       //ComboTextFilter = "<Multiple Selected>"; 
       break; 
     } 

     NotifyPropertyChanged(nameof(C_Foreground)); 
    } 

    public bool DropOpen 
    { 
     get { return dropopen; } 
     set { dropopen = value; NotifyPropertyChanged(nameof(ComboTextFilter)); } 
    } 
    private bool dropopen = false; 

Примечание: Эта ComboBox также изменяет текст ComboBox в зависимости от выбранных элементов.

Смежные вопросы