我正在尝试实现一个带有复选框的组合框。我在 Google/SO 上找到的所有文章/资源都建议向我的业务对象添加一个布尔值。但我希望创建一个可重用的控件。因此,我创建了一个从组合框继承的自定义控件,并在弹出窗口中使用 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>
正如预期的那样,它显示了一个带有复选框的组合框。但我无法弄清楚如何跟踪检查的项目?我正在考虑收听已检查的事件,但是当我尝试在我的代码隐藏中获取 Checkbox 时,FindName 返回 null。
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (this.Template != null)
{
var v = Template.FindName("PART_Checkbox",this);
Debug.Assert(v != null);
}
}
谢谢。