【问题标题】:Two Way Binding: Combobox of Checkboxes - Kind of Working but not两种方式绑定:复选框的组合框 - 工作但不是
【发布时间】:2013-01-19 00:45:05
【问题描述】:

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

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

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

问题是当我在别处更新这些 MultiSelectDropDownItems 之一的 Selected 属性时。该属性触发一个 PropertyChanged 事件,但这次更改并未反映在 Checkbox 中。

我已经研究这个很久了,在我的一生中,我无法弄清楚为什么没有更新更改 - 为什么 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

【问题讨论】:

    标签: wpf data-binding 2-way-object-databinding


    【解决方案1】:

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

    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(value))
    

    应该是这样的

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

    我后来在 VB 选项卡上通过这个 msdn link 证实了我的猜测

    【讨论】:

    • 是的,我也试过这个也无济于事。我能问一下你的复选框没有被声明为“三态”是什么意思吗?第三态从何而来?可以为空?
    • 是这样的: 我不确定 IsThreeState 的默认值是真还是假
    • 我不会厌倦这个,我会的——但我为什么要呢?这是什么意思?绑定到控件的值是一个不可为空的布尔值。谢谢!
    • 我刚试过这个,但没有用 - 我明白你为什么建议它了。我猜如果组合启用了三态,但对象只有 2 态,这可能会产生影响。我想不是……我还是不知道。我也从 XAML 中删除了事件挂钩,在加载控件时仍然正确填充了值,并且在切换框时更新了视图模型 - 但是当我更改值时它仍然没有更新代码中其他地方的视图模型。
    • 感谢您的建议-但这并不是我遇到的问题!当我在代码隐藏中更新复选框绑定到的对象时,复选框不会被更新。如果我单击复选框,它工作正常。无论如何,感谢您的意见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多