数据绑定复选框“IsChecked”属性更改不会持久

时间:2013-09-27 18:50:11

标签: wpf vb.net data-binding checkbox

我将TreeView绑定到一个具有“IsChecked”属性的类,该属性与树视图中的复选框一起使用。我需要做的是,只要选中/取消选中复选框,就会调整相关的“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
...

我尝试了以下方法,其中没有一个有效:

  • 在更改了isCheckedLocal之后,我在上面的“Set”中放置了RaiseEvent PropertyChanged(Me,New PropertyChangedEventArgs(“IsChecked”))。建议here

  • 我为复选框“Checked”和“Unchecked”属性创建了处理程序。这个问题是他们会在我的所有其他代码之后运行。建议here

更新

  • 我现在在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
    

2 个答案:

答案 0 :(得分:0)

为了使INotifyPropertyChange起作用,您必须提高属性更改。这是C#,但你明白了:

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

注意到字符串与属性名称完全相同。然后在幕后连线。

答案 1 :(得分: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)