TreeView のチェックボックスと組み合わせて使用される「IsChecked」プロパティを持つクラスに TreeView をバインドしました。私がする必要があるのは、チェックボックスがチェック/チェック解除されるたびに、関連する「IsChecked」プロパティが調整されることです。
現在、ツリー ビューでチェックボックスの選択を解除すると、コードはプロパティを false に設定しますが、コードが続行され、後でそのプロパティを再度参照すると、プロパティは再び「True」に設定されます。プロパティの新しい値が変わらない理由と、解決策を説明できる人はいますか?
私の(失敗した)試みたアプローチは一番下にあります。
XAML は次のとおりです。
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=BusGrps}">
<CheckBox Name="ChkBxEnterprise" Content="{Binding Path=Name}" IsEnabled="{Binding Path=Enabled}" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"/>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Programs}">
<CheckBox Name="ChkBxBusGrp" Content="{Binding Path=Name}" IsEnabled="{Binding Path=Enabled}" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<CheckBox Name="ChkBxProg" Content="{Binding Path=Name}" IsEnabled="{Binding Path=Enabled}" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
そして、これはクラスです:
<Serializable()> Public Class LvlProgram
Implements INotifyPropertyChanged
Public Shared Event selectionChanged(ByVal busgrp As String, ByVal name As String, ByVal selected As System.Nullable(Of Boolean))
Private busGrpLocal As String
Private nameLocal As String
'Private camsLocal As New List(Of LvlCAM)
'Private periodsLocal As New List(Of PeriodScore)
Private camsLocal As New ObservableCollection(Of LvlCAM)
Private periodsLocal As New ObservableCollection(Of PeriodScore)
Private isCheckedLocal As Boolean = True
Private enabledLocal As Nullable(Of Boolean) = False
Public Property Enabled As Nullable(Of Boolean)
Get
Return enabledLocal
End Get
Set(value As Nullable(Of Boolean))
enabledLocal = value
End Set
End Property
Public Property IsChecked As Boolean
Get
Return isCheckedLocal
End Get
Set(value As Boolean)
If isCheckedLocal <> value Then
isCheckedLocal = value
OnPropertyChanged(New PropertyChangedEventArgs("IsChecked"))
RaiseEvent selectionChanged(BusGrp, Name, value)
End If
End Set
End Property
...
私は次のことを試しましたが、どれもうまくいきませんでした:
上記の「Set」に、isCheckedLocal を変更した後に RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("IsChecked")) を配置しました。ここで提案。
チェックボックスの「Checked」および「Unchecked」属性のハンドラーを作成しました。これの問題は、他のすべてのコードの後に実行されることです。ここで提案。
アップデート:
isCheckedLocal = value の直後に OnPropertyChanged(New PropertyChangedEventArgs("IsChecked")) を使用しようとして失敗しました
<NonSerialized()> Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs) If Not PropertyChangedEvent Is Nothing Then RaiseEvent PropertyChanged(Me, e) End If End Sub