我有一个填充有复选框的组合框。
ComboxBox 的 ItemsSource 绑定到要绑定复选框的对象列表;一个视图模型。视图模型是一个简单的对象(MultiSelectDropDownItem 类型),它有一个布尔字段名称 Selected。
现在,ItemsSource 以编程方式设置。这可以; 绑定视图模型的复选框的属性都已正确填充,如果我选中/取消选中复选框,则更改会反映在视图模型中。所以对我来说,双向绑定是有效的。
问题是当我在别处更新这些 MultiSelectDropDownItems 之一的 Selected 属性时。该属性触发一个 PropertyChanged 事件,但这次更改未反映在复选框中。
我已经研究这个很久了,在我的一生中,我无法弄清楚为什么没有更新更改 - 为什么 PropertyChanged 事件没有更新 CheckBox,即使复选框后面的对象已经有了它属性变了?
XAML:
<ComboBox x:Name="FieldOptions"
ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch"
Height="30"
KeyDown="FieldOptions_OnKeyDown">
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox Name="checkbox"
Content="{Binding Path=Text}"
Uid="{Binding Path=ID}"
IsChecked="{Binding Path=Selected, Mode=TwoWay}"
FontStyle="Normal"
Foreground="Black"
Checked="CheckBox_OnChecked"
Unchecked="CheckBox_Unchecked"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
代码隐藏(请原谅 VB-不是我的选择!):
Dim items As List(Of MultiSelectDropDownItem) = CreateDropdownItems()
FieldOptions.ItemsSource = items
''' <summary>
''' Represents an item for a Multi-Select drop-down control; a 'View-Model' for combo-items.
''' </summary>
''' <remarks>LN - 08/01/2013</remarks>
Private Class MultiSelectDropDownItem
Inherits clsTemplateControlText
Implements INotifyPropertyChanged
Private _selected As Boolean
Public Property Selected() As Boolean
Get
Return _selected
End Get
Set(value As Boolean)
If (value <> _selected) Then
_selected = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(value))
End If
End Set
End Property
Public Sub New(ByVal tct As clsTemplateControlText, ByVal selected As Boolean)
ID = tct.ID
ControlID = tct.ControlID
Text = tct.Text
ParentID = tct.ParentID
ItemOrder = tct.ItemOrder
_selected = selected
End Sub
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
End Class