3

我目前陷入了以下情况的死胡同:

我有一个List<Category>集合,每个集合都Category包含一个Id,Name和一个List<string[]>名为的属性Subcategory(其中数组包含该子类别的Nameand Id- 我不想创建另一个类)。

我有一个正确绑定到类别和子类别的方法TreeViewHierarchicalDataTemplate我在树节点旁边还有复选框,我绑定IsCheckedMultiBinding子/类别的 Id 和应检查的子/类别的整体列表。

<CheckBox.IsChecked>
    <MultiBinding Converter="{StaticResource IsCategoryChecked}">
        <Binding Path="Id"/>
         <Binding Path="myDataSet.Tables[Categories]/cat_subcat"/>
    </MultiBinding>
</CheckBox.IsChecked>

我使用的转换器只是检查我提供的子/类别的名称是否是列表的一部分(两者都是我绑定的值)。这很好用,总的来说我对结果很满意。

问题在于将检查/取消检查转换回来。当用户更改IsChecked值时,我必须将子/类别的 ID 添加到所有已选中类别的列表中,或者从中删除该 ID。不幸的是,当我尝试为 实现ConvertBack()方法时IMultiValueConverter,我只能访问已更改的 ACTUAL 值(IsChecked 的真或假值),并且无法访问特定复选框绑定到的子/类别的 Id .

我尝试过但失败的解决方案:

  1. 在进行初始转换时保存子/类别名称不是一个选项,因为我对所有子/类别使用相同的转换器,因此我只会保存我尝试转换的最后一个子/类别。

  2. 使用MouseUp/KeyUp事件是没有用的,因为(无论出于何种原因)它们无法被触发(一个错误?)。

我正在考虑忽略ConvertBack()并使用Checked/Unchecked事件,但觉得这是一个相当“肮脏”的解决方案,因为我不妨完全忽略绑定!这是唯一的出路吗?我已经没有选择了,但仍然希望有一个“好的”解决方案,如果它在那里的话!

4

1 回答 1

2

你有几个选择,我在生产中都使用过:

  1. 正如您所说,已选中/未选中重载,这使您可以最大程度地控制情况
  2. 在代码中将 IsCategoryChecked 属性添加到您的强类型表中,该表在后台处理所需的更改,并且您绑定到 IsCategoryChecked 属性而不是使用转换器

由于强类型数据集的部分分类,第二个工作得相当好。但是,它仍然不是“无缝”的。

于 2009-04-13T20:43:39.977 回答