WPF绑定转换器
我目前陷入了死胡同,情况如下: 我有一个WPF绑定转换器,wpf,data-binding,treeview,wpf-controls,Wpf,Data Binding,Treeview,Wpf Controls,我目前陷入了死胡同,情况如下: 我有一个列表集合,每个类别都包含一个Id,名称和一个名为子类别的列表属性(其中数组包含该子类别的名称和Id,我不想创建另一个类) 我有一个TreeView,其中hierarchycaldatatemplate正确绑定到类别和子类别。我在树节点旁边也有复选框,我将IsChecked绑定到子/类别Id的MultiBinding,以及应勾选的子/类别的总体列表 <CheckBox.IsChecked> <MultiBinding Convert
列表
集合,每个类别
都包含一个Id
,名称
和一个名为子类别
的列表
属性(其中数组包含该子类别的名称
和Id
,我不想创建另一个类)
我有一个TreeView
,其中hierarchycaldatatemplate
正确绑定到类别和子类别。我在树节点旁边也有复选框,我将IsChecked
绑定到子/类别Id的MultiBinding
,以及应勾选的子/类别的总体列表
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource IsCategoryChecked}">
<Binding Path="Id"/>
<Binding Path="myDataSet.Tables[Categories]/cat_subcat"/>
</MultiBinding>
</CheckBox.IsChecked>
我使用的转换器只是检查我提供的子/类别的名称是否是列表的一部分(两者都是我绑定到的值)。这很好,总体来说我对结果很满意
将选中/取消选中转换回时会出现问题。当用户更改IsChecked
值时,我必须将子/类别的Id添加到所有已勾选类别的列表中,或从中删除该Id。不幸的是,当我尝试为IMultiValueConverter
实现ConvertBack()
方法时,我只能访问已更改的实际值(IsChecked的真值或假值),无法访问该特定复选框绑定到的子/类别的Id
我尝试过但惨败的解决方案:
MouseUp
/KeyUp
事件是无用的,因为(无论出于何种原因)它们无法被触发(bug?)我正在考虑忽略
ConvertBack()
并使用Checked
/Unchecked
事件,但感觉这是一个相当“肮脏”的解决方案,因为我可能完全忽略绑定!这是唯一的路吗?我已经没有选择了,但仍然希望有一个“好”的解决方案,如果它存在的话 您有两种选择,我在生产中使用了这两种选择:
由于使用强类型数据集进行部分分类,第二种方法工作得相当好。然而,它仍然不是“无缝的”。你的第二个建议似乎很有趣。不过我有一个问题。我需要一个双向绑定,这意味着它必须根据绑定的数据来确定是否要签出(现在可以正常工作),如果用户签出,它还必须编辑数据。我该如何处理Target->Source的更改?我不知道您刚刚使用了一个字符串作为子类别,这会产生一些摩擦,您无法完全转换回。基本上,如果您有一个完整的Category类,可以是cat或subcat,那么它们会知道自己的父类,并且可以处理Target->Source。