2016-08-11 97 views

回答

0

是的,这是可能的。我已经做了类似的ListView,这本质上是相同的控制。这里的诀窍是使其成为FAST。如果你有成千上万的物品,它不应该花费30秒。

现在,你如何实现它取决于你是否想要构建一个通用控件或专门为此对象类型创建的控件。原因在于要做到这一点,你需要知道项目对象的哪个属性是IsChecked。在我的控制下,我创建了一个名为IsCheckedPath的DP,因此它本着WPF的精神。然后控件会自动将每个对象的IsCheckedPath属性绑定到相应的复选框。

当主复选框被切换时,您需要遍历项目并设置属性值。您有2个选择:1)反射或2)在设置IsCheckedPath DP时编译表达式树。

我做了#2,因为反射会太慢。

如果你只关心这个特定的对象,并不认为你会重复使用该控件,那么你可以跳过这两个,只需设置属性。不是一个好主意IMO,我会去通用路线:)。

此外,请注意,您不能采用“快捷方式”并通过视觉效果循环,并从另一侧设置复选框,因为WPF控制虚拟化并且复选框对于滚动出来的项目不会“活动”视图。

0

你好,欢迎来到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应该为null。 IsChecked可以为null,因为该属性的类型是bool? (可为空的布尔值),这是WPF中三态复选框的工作原理。

+0

这并没有解决我的问题,我已经缩小到IValueConverter,但我不知道如何解决它,我现在将添加IValueConverter。 –