Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF绑定转换器_Wpf_Data Binding_Treeview_Wpf Controls - Fatal编程技术网

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
    事件,但感觉这是一个相当“肮脏”的解决方案,因为我可能完全忽略绑定!这是唯一的路吗?我已经没有选择了,但仍然希望有一个“好”的解决方案,如果它存在的话

    您有两种选择,我在生产中使用了这两种选择:

  • 如你所说,过载检查/未检查,这使你能够最大程度地控制情况
  • 将IsCategoryChecked属性添加到代码后台的强类型表中,该代码后台处理后台所需的更改,然后绑定到IsCategoryChecked属性,而不是使用转换器

  • 由于使用强类型数据集进行部分分类,第二种方法工作得相当好。然而,它仍然不是“无缝的”。

    你的第二个建议似乎很有趣。不过我有一个问题。我需要一个双向绑定,这意味着它必须根据绑定的数据来确定是否要签出(现在可以正常工作),如果用户签出,它还必须编辑数据。我该如何处理Target->Source的更改?我不知道您刚刚使用了一个字符串作为子类别,这会产生一些摩擦,您无法完全转换回。基本上,如果您有一个完整的Category类,可以是cat或subcat,那么它们会知道自己的父类,并且可以处理Target->Source。