Wpf组合框中有复选框

本文关键字:复选框 组合 Wpf | 更新日期: 2023-09-27 18:19:03

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

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

如预期的那样,它显示了一个带有复选框的组合框。但是我不知道如何跟踪检查项目?我想听检查的事件,但当我试图在我的代码后面得到复选框,FindName返回null。

public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            if (this.Template != null)
            {
                var v = Template.FindName("PART_Checkbox",this);
                Debug.Assert(v != null);
            }
        }

谢谢。

Wpf组合框中有复选框

  1. 继承自ListBox
  2. 将项目模板中的CheckBox绑定到ListBoxItem.IsSelected(通过ItemContainerStyle设置为默认样式)
  3. 设置SelectionModeMultiple

SelectedItems则包含您的选择。您可能还希望将您的选择区域绑定到SelectedItems的逗号分隔列表(例如,可以通过转换器完成)。