C# 带有复选框的Wpf组合框

C# 带有复选框的Wpf组合框,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试实现一个带有复选框的组合框。我在Google/SO上找到的所有文章/资源都建议在我的业务对象中添加bool。但我希望创建一个可重用的控件。 因此,我创建了一个从combobox继承的自定义控件,并使用itemscontrol更改了弹出窗口中的控件。 这是我的XAML(为简洁起见,只添加弹出窗口的XAML) 谢谢 从列表框继承 将复选框绑定到项目模板中的ListBoxItem.IsSelected(通过ItemContainerStyle将其设置为默认样式) 将SelectionMode

我正在尝试实现一个带有复选框的组合框。我在Google/SO上找到的所有文章/资源都建议在我的业务对象中添加bool。但我希望创建一个可重用的控件。 因此,我创建了一个从combobox继承的自定义控件,并使用itemscontrol更改了弹出窗口中的控件。 这是我的XAML(为简洁起见,只添加弹出窗口的XAML)

谢谢

  • 从列表框继承
  • 复选框
    绑定到项目模板中的
    ListBoxItem.IsSelected
    (通过
    ItemContainerStyle
    将其设置为默认样式)
  • SelectionMode
    设置为
    Multiple

  • SelectedItems
    然后包含您的选择。您可能还想将您的选择区域绑定到类似于逗号分隔的
    SelectedItems列表的东西上(例如可以通过转换器完成)。

    完美!在我的xaml中使用了listbox而不是itemscontrol,工作起来很有魅力。谢谢
    <Popup Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" AllowsTransparency="True" Focusable="False" PopupAnimation="Slide">
     <Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}"  MaxHeight="{TemplateBinding MaxDropDownHeight}">
      <Border x:Name="DropDownBorder" Background="{StaticResource BackgroundBrush}" BorderThickness="1" BorderBrush="{StaticResource BorderBrush}" />
         <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
             <ItemsControl ItemsSource="{Binding ItemsSource,RelativeSource={RelativeSource AncestorType=local:CheckedComboBox}}">
                 <ItemsControl.ItemTemplate>
                               <DataTemplate>
                                    <CheckBox Content="{Binding}" x:Name="PART_Checkbox" />
                                </DataTemplate>
                   </ItemsControl.ItemTemplate>
               </ItemsControl>
         </ScrollViewer>
      </Grid>
    </Popup>
    
    public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
    
                if (this.Template != null)
                {
                    var v = Template.FindName("PART_Checkbox",this);
                    Debug.Assert(v != null);
    
                }
            }