【发布时间】:2016-12-18 19:58:33
【问题描述】:
你在 WPF 的组合框中实现了一个复选框。
【问题讨论】:
标签: c# wpf xaml checkbox combobox
你在 WPF 的组合框中实现了一个复选框。
【问题讨论】:
标签: c# wpf xaml checkbox combobox
您好,欢迎来到 WPF!对于这种情况,您正在寻找 MultiBinding 。由于主复选框可以更改单个复选框,反之亦然,因此绑定应该是双向的。 MultiBinding 将应用于主复选框,如下所示:
<Checkbox x:Name="MasterCheckBox">
<Checkbox.IsChecked>
<MultiBinding Converter="[Instance of your converter class]" Mode="TwoWay">
<Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Mobile}"/>
<Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Skype}"/>
<Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Landline}"/>
</MultiBinding>
</Checkbox.IsChecked>
您还需要创建一个转换器。上面链接的文章描述了如何制作一个简单的转换器。在您的情况下,由于绑定是双向的,因此您需要同时处理 Convert 和 ConvertBack 方法。 ConvertBack 方法在用户更改主复选框时运行,因此必须将多重绑定下的所有绑定设置为 true 或 false。 Convert 方法在单个复选框之一更改时运行。在这种情况下,在 WPF 中,如果选中所有单个框,则将主复选框的 IsChecked 设置为 true 是正确的,如果未选中所有单个框,则设置为 false,如果它们混合,则 IsChecked 应该为空。 IsChecked 可以为 null,因为该属性的类型是布尔值? (nullable bool),这就是三态复选框在 WPF 中的工作方式。
【讨论】:
是的,这是可能的。我对 ListView 做了类似的事情,它本质上是相同的控件。这里的诀窍是让它FAST。如果您有数千个项目,则不需要 30 秒或其他任何时间。
现在,您如何实现它取决于您是要构建通用控件还是专门为此对象类型构建的控件。原因是要快速执行此操作,您需要知道项目对象的哪个属性是 IsChecked。在我的控制下,我创建了一个名为 IsCheckedPath 的 DP,因此它本着 WPF 的精神。然后控件会自动将每个对象的 IsCheckedPath 属性绑定到相应的复选框。
当主复选框被切换时,您需要循环遍历 Items 并设置属性值。您有 2 种选择:1) 反射或 2) 在设置 IsCheckedPath DP 时编译表达式树。
我做了#2,因为反射太慢了。
如果您只关心这个特定对象并且认为您永远不会重用该控件,那么您可以跳过这两个并只设置属性。 IMO 不是一个好主意,我会走一般路线:)。
另外,请注意,您不能使用“快捷方式”并循环浏览视觉效果并从另一侧设置复选框,因为 WPF 控件虚拟化,并且复选框对于滚动到视图之外的项目将不会“活动” .
【讨论】: