2009-04-13 125 views
3

我目前停留在有以下情况死胡同:WPF绑定转换器

我有一个List<Category>集合,每个Category包含IdNameList<string[]>属性调用Subcategory(其中数组包含NameId那个subcagtegory - 我不想创建另一个班级)。

我有一个TreeViewHierarchicalDataTemplate正确绑定到类别和子类别。我也在树节点旁边有复选框,我将IsChecked绑定到子/类别的Id的MultiBinding以及应该检查的子/类别的总体列表。

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

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

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

SOLUTIONS我做过尝试,但惨遭失败:

  1. 保存子/类别名称,当我做最初的转换是不是一种选择,因为我使用的是相同的转换为所有子/类别因此我只会保存我试图转换的最后一个子/类别。

  2. 使用MouseUp/KeyUp事件是无用的,因为(无论什么原因)它们无法被触发(一个bug?)。

我考虑忽略ConvertBack()和使用Checked/Unchecked事件,而不是,但觉得这是一个相当“脏”的解决方案,因为我还不如完全忽略绑定!这是唯一的方法吗?我已经没有选择,但仍希望有一个“好”的解决方案,如果它在外面!

回答

2

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

  1. 超载选中/未选中,如你所说,它使您的情况
  2. 添加最多的控制一个IsCategoryChecked属性强类型的表后面的代码,其在后台处理所需的更改,并且绑定到IsCategoryChecked属性,而不是使用转换器

第二个工作相当好感谢局部类使用强类型数据集。但是,它仍然不是“无缝的”。

+0

你的第二个建议看起来很有趣。但我有一个问题。我需要一个双向绑定,这意味着它必须确定是否基于绑定数据进行检查(现在运行良好),并且还必须在用户检查时编辑数据。我将如何处理目标 - >来源变更? – Alexandra 2009-04-14 14:40:47