0

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
    
4

2 に答える 2

0

INotifyPropertyChange が機能するには、プロパティの変更を発生させる必要があります。これは C# ですが、アイデアは次のとおりです。

        public DateTime MigrationDate
        {
            get { return _migrationDate; }
            set
            {
                _migrationDate = value;
                RaisePropertyChanged("MigrationDate");
            }
        }

文字列がプロパティ名とまったく同じであることに注意してください。次に、これは舞台裏で配線されます。

于 2013-09-27T18:55:31.870 に答える
0

使ってみて

Public Shared Event selectionChanged(ByVal busgrp As String, ByVal name As String, ByRef selected As System.Nullable(Of Boolean))

それ以外の

Public Shared Event selectionChanged(ByVal busgrp As String, ByVal name As String, ByVal selected As System.Nullable(Of Boolean)
于 2013-09-27T18:58:14.083 に答える