2017-02-17 52 views
2

的整个宽度我有一个乘法与组合框项的复选框如何伸展复选框项组合框

<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> 

当我点击复选框,一切都很好。但是如果复选框的宽度小于组合框的宽度,当点击复选框的右侧时,组合框关闭。如何覆盖这种行为?

回答

2

套装HorizontalContentAlignmentStretchComboBox.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

我刚刚明白Orientation =“Horizo​​ntal”是粘贴代码的错误。它应该是垂直的。抱歉 – Ron

0

通过拉敏答案是部分地好。您也必须从您的数据模板中删除<StackPanel Orientation="Horizontal">.It是他限制您的复选框扩展所有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

All Answers did not for me。什么做的诀窍是设置

Horizo​​ntalContentAlignment = “拉伸”

为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> 

代码隐藏:

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的文本取决于所选的元素。