Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf “数据绑定复选框”;IsChecked";属性更改不持久_Wpf_Vb.net_Data Binding_Checkbox - Fatal编程技术网

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

Wpf “数据绑定复选框”;IsChecked";属性更改不持久,wpf,vb.net,data-binding,checkbox,Wpf,Vb.net,Data Binding,Checkbox,我将TreeView绑定到一个类,该类具有与树视图中的复选框结合使用的“IsChecked”属性。我需要做的是,无论何时选中/取消选中复选框,都会调整相关的“IsChecked”属性 现在,当我取消选中树视图中的复选框时,代码将属性设置为false,但是当代码继续并稍后再次引用该属性时,属性将再次设置为“True”。有人能解释为什么房产的新价值不会改变,解决方案是什么吗 我尝试的(失败的)方法位于底部 以下是XAML本身: <TreeView.ItemTemplate> <

我将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
...
公共类LvlProgram
实现INotifyPropertyChanged
公共共享事件选择已更改(ByVal busgrp作为字符串,ByVal name作为字符串,ByVal作为System.Nullable(布尔值))
私有总线作为字符串
私有名称本地作为字符串
“私有camsLocal作为新列表(LvlCAM)
'专用周期本地作为新列表(周期分数)
私有camsLocal作为新的可观察集合(LvlCAM)
私有周期本地作为新的可观察集合(周期分数)
Private isCheckedLocal为布尔值=True
Private enabledLocal As Nullable(属于布尔值)=False
已启用为可空的公共属性(属于布尔值)
得到
返回使能本地
结束
设置(值为空(布尔值))
enabledLocal=值
端集
端属性
公共属性被检查为布尔值
得到
返回isCheckedLocal
结束
设置(值为布尔值)
如果检查局部值,则
isCheckedLocal=值
OnPropertyChanged(新PropertyChangedEventArgs(“IsChecked”))
RaiseEvent selectionChanged(总线组、名称、值)
如果结束
端集
端属性
...
我尝试过以下方法,但均无效:

  • 在isCheckedLocal更改后,我将RaiseEvent PropertyChanged(我,新PropertyChangedEventArgs(“IsChecked”))放在上述“集合”中。建议

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

更新:

  • 我现在尝试在isCheckedLocal=value之后立即使用OnPropertyChanged(newPropertyChangedEventArgs(“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
    
    公共事件属性更改为PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged
    Public Sub-OnPropertyChanged(通过值e作为PropertyChangedEventArgs)
    如果不是,那么PropertyChangedEvent什么都不是
    RaiseEvent属性已更改(Me,e)
    如果结束
    端接头
    

要使INotifyPropertyChange正常工作,必须进行属性更改。这是C#,但你明白了:

        public DateTime MigrationDate
        {
            get { return _migrationDate; }
            set
            {
                _migrationDate = value;
                RaisePropertyChanged("MigrationDate");
            }
        }
注意字符串与属性名完全相同。然后,这将在后台连接。

尝试使用

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)

您的类需要实现INotifyPropertyChanged,并且您必须在IsChecked属性上引发property changed事件,您可以在不希望通知ui的属性的setter中执行此操作。我的类已经在执行此操作,但我未能显示此操作。