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);
}
}
谢谢。
- 继承自ListBox
- 将项目模板中的
CheckBox
绑定到ListBoxItem.IsSelected
(通过ItemContainerStyle
设置为默认样式) - 设置
SelectionMode
为Multiple
SelectedItems
则包含您的选择。您可能还希望将您的选择区域绑定到SelectedItems
的逗号分隔列表(例如,可以通过转换器完成)。