2

チェックボックスが設定された ComboBox があります。

ComboxBox の ItemsSource は、チェック ボックスにバインドされるオブジェクトの List にバインドされます。ビューモデル。ビュー モデルは、ブール フィールド名 Selected を持つ単純なオブジェクト (MultiSelectDropDownItem 型) です。

現在、ItemsSource はプログラムで設定されています。これで問題ありません。ビューモデルにバインドされているチェックボックスの属性はすべて適切に設定されており、チェックボックスをオンまたはオフにすると、変更がビューモデルに反映されます。だから私には、双方向バインディングが機能しています。

問題は、これらの MultiSelectDropDownItems のいずれかの Selected プロパティを他の場所で更新したときです。プロパティは PropertyChanged イベントを発生させますが、今回は変更がチェックボックスに反映されません。

私はこれを長い間見てきましたが、私の人生では、変更が更新されない理由を理解できません-チェックボックスの背後にあるオブジェクトがあったとしても、PropertyChangedイベントがチェックボックスを更新しないのはなぜですかプロパティが変更されましたか?

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
4

1 に答える 1

2

VB の専門家ではありませんが、何が問題なのかを見つけたと思います。

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(value))

次のようなものでなければなりません

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

後で、VBタブのこのmsdnリンクからの推測を​​確認しました

于 2013-01-18T15:48:03.850 に答える