【发布时间】:2012-04-27 22:32:00
【问题描述】:
我正在开发一个 ComboBox,它的项目必须有一个 CheckBox。我已经实现了一项功能来参与这些复选框的更改。该功能的一部分从 CheckBoxes 建立 ComboBox 的内容(即,当我选择“pear”、“apple”和“blueberry”时,组合必须检查这些项目,并且它的内容也有 成为'梨;苹果;蓝莓')。
我已经做到了。但是,由于我使用的是 ComboBox,因此每当我单击其复选框外的项目时都会选择项目,因此内容会被项目的文本覆盖。这个 xaml 显示了它是如何编写的:
<ComboBox IsEditable="True" DataContext="{Binding}"
IsTextSearchEnabled="False" IsReadOnly="True">
<ComboBox.ItemTemplate>
<DataTemplate >
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Path=EstaSeleccionado,
Mode = TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="{Binding Path=Item.Value}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
如何在不禁用复选框的情况下禁用列表项?
更新 在您的回答中尝试跳过事件。我知道这可以或多或少地干净和容易地完成;但出于可维护性的考虑,我更喜欢基于 property-xaml 的解决方案(即禁用 ListBoxItem 上的事件,除了复选框的屏幕区域等)
【问题讨论】:
-
不是 100% 确定,但您可以在您的组合框上挂接到 SelectionChanged 并将处理设置为 true 吗?
-
我尽量不使用任何事件。实际上,CheckBox 绑定到一个实现 INotifyPropertyChanged 的特殊类,因此被选中的项目负责自己的选择而无需中继。但如果我没有得到任何有用的响应或我自己发现它,我将使用事件。
标签: wpf xaml checkbox combobox listitem