Wpf 双向绑定:复选框的组合框-可以工作,但不能

Wpf 双向绑定:复选框的组合框-可以工作,但不能,wpf,data-binding,2-way-object-databinding,Wpf,Data Binding,2 Way Object Databinding,我有一个包含复选框的组合框 ComboxBox的ItemsSource绑定到要绑定到复选框的对象列表;视图模型。视图模型是一个简单对象(类型为MultiSelectDropDownItem),它选择了一个布尔字段名 现在,ItemsSource是以编程方式设置的。这很好;绑定到视图模型的复选框的属性都已正确填充,如果我选中/取消选中复选框,更改将反映在视图模型中。所以对我来说,双向绑定是有效的 问题是当我在别处更新其中一个MultiSelectDropDownItems的Selected属性时。

我有一个包含复选框的组合框

ComboxBox的ItemsSource绑定到要绑定到复选框的对象列表;视图模型。视图模型是一个简单对象(类型为MultiSelectDropDownItem),它选择了一个布尔字段名

现在,ItemsSource是以编程方式设置的。这很好;绑定到视图模型的复选框的属性都已正确填充,如果我选中/取消选中复选框,更改将反映在视图模型中。所以对我来说,双向绑定是有效的

问题是当我在别处更新其中一个MultiSelectDropDownItems的Selected属性时。属性触发PropertyChanged事件,但这次更改不会反映在复选框中

我已经看了很久了,在我的一生中,我不明白为什么更改没有被更新-为什么PropertyChanged事件没有更新复选框,即使复选框后面的对象的属性发生了更改

XAML:


代码隐藏(请原谅VB-不是我的选择!):

Dim items As List(Of MultiSelectDropDownItem)=CreateDropdownItems()
FieldOptions.ItemsSource=项目
''' 
''表示多选下拉控件的项目;组合项的“视图模型”。
''' 
''2013年1月8日
私有类MultiSelectDropDownItem
继承clsTemplateControlText
实现INotifyPropertyChanged
Private\u选择为布尔值
已选择公共属性()作为布尔值
得到
返回(已选择)
结束
设置(值为布尔值)
如果(选择值),则
_选定=值
RaiseEvent PropertyChanged(Me,新PropertyChangedEventArgs(值))
如果结束
端集
端属性
Public Sub New(ByVal tct作为clsTemplateControlText,ByVal作为布尔值选择)
ID=tct.ID
ControlID=tct.ControlID
Text=tct.Text
ParentID=tct.ParentID
ItemOrder=tct.ItemOrder
_选定的=选定的
端接头
公共事件PropertyChanged为PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged
末级

虽然我不是VB专家,但我想我发现了问题所在:

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(value))
应该是

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Selected"))

我后来在VB选项卡上的msdn中确认了我的猜测

是的,我也尝试过,但没有任何效果。我可以问一下,复选框未声明为“三态”是什么意思吗?第三个州来自哪里?可以为空?是的,像这样:我不确定IsThrestate的默认值是真是假我还没有厌倦这个,我会的-但我为什么要这么做?这是什么意思?绑定到控件的值是不可为空的布尔值。谢谢我只是试了一下,但没用——我明白你为什么建议它了。我猜如果组合启用了三态,但对象只有两态,这可能会产生影响。我想不会吧。。。我还是不知道。我也从XAML中删除了事件挂钩,在加载控件时,值仍然正确填充,当切换框时视图模型会更新,但当我从代码中的其他地方更改视图模型的值时,视图模型仍然不会更新。感谢您的建议-这并不是我遇到的问题!当我更新代码隐藏中绑定的复选框的对象时,复选框不会被更新。如果我点击复选框,它可以正常工作。谢谢你的意见!
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(value))
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Selected"))