Wpf 如何将复选框项拉伸到组合框的整个宽度

Wpf 如何将复选框项拉伸到组合框的整个宽度,wpf,combobox,stretch,multiplication,Wpf,Combobox,Stretch,Multiplication,我有一个带有复选框项的乘法组合框 <ComboBox x:Name="cmb" IsEditable="True" IsReadOnly="True" DropDownClosed="cmb_DropDownClosed"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal">

我有一个带有复选框项的乘法组合框

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


当我点击复选框时,一切正常。但是如果复选框宽度小于组合框的宽度,当我单击复选框右侧时,组合框关闭。如何覆盖此行为

组合框中的
水平内容对齐
设置为
拉伸
。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>

拉明的答案部分是好的。您还必须从数据模板中删除
。是他限制您的复选框在所有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>

所有答案对我都不适用。这个诡计是怎么设的

HorizontalContentAlignment=“拉伸”

对于复选框:

<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;
私有字符串combotextfilter=”“;
公共字符串组合文本过滤器
{
获取{return combotextfilter;}
设置
{
if(value!=null&&value.IndexOf(“ComboModel”)!=-1)返回;
combotextfilter=值;
NotifyPropertyChanged(nameof(ComboTextFilter));
}
}
私有无效复选框\u选中\u未选中(对象发送方,路由目标)
{
开关(((ObservableCollection)combobox.ItemsSource.Count(x=>x.IsChecked))
{
案例0:
ComboTextFilter=“”;
打破
案例1:
ComboTextFilter=((ObservableCollection)combobox.ItemsSource).Where(x=>x.IsChecked.First().Eintrag;
打破
违约:
ComboTextFilter=((ObservableCollection)combobox.ItemsSource)。其中(x=>x.IsChecked)。选择(x=>x.Eintrag)。聚合((i,j)=>i+“|”+j);
//ComboTextFilter=“”;
打破
}
NotifyPropertyChanged(姓名(C_前台));
}
公共图书馆开放
{
获取{return dropopen;}
设置{dropopen=value;NotifyPropertyChanged(nameof(ComboTextFilter));}
}
private bool dropopen=false;

注意:此组合框还可以根据所选元素更改组合框的文本。

我只知道Orientation=“Horizontal”是复制粘贴代码时的一种打字错误。它应该是垂直的。很抱歉