单击时将 ListVIew 中的 WPF CheckBox 从启用更新为禁用,INotify 不工作

Update WPF CheckBox in ListVIew from Enabled to Disabled When Clicked, INotify not working

我有一个 ListView,它在下面显示了 CheckBoxes XAML 的列表。 Checkbox是自定义的class,代码如下。复选框的初始状态设置正确。但是,当单击复选框时,它应该被禁用 (IsEnabled = False),但这并没有发生,尽管在自定义 class 中实现了如下所示的 INotify 代码(尽管我怀疑错误是在某处,或者 XAML 标记是错误的)。我什至试图强制对 Click 事件进行绑定更新,但没有帮助,代码如下。有人可以帮忙吗?

编辑:我刚刚意识到解释可能有点混乱。以下是应该发生的情况:1) 自定义复选框显示初始值(这部分工作正常),2) 用户单击复选框,3) Click 事件应该触发并更新 IsChecked 属性(看起来像这样观察属性时在调试器中发生),4)IsEnabled 属性 切换到 False 并禁用控件(失败)。

XAML:

<DataTemplate>
<CheckBox Content="test" 
    ToolTip="test"
    IsThreeState="False"
    x:Name="myCheckBox"
    Click="MyClickEvent_OnClicked"
    IsChecked="{Binding outIsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>

自定义复选框:

Public Class MyCustomCheckBox
    Inherits CheckBox
    Implements INotifyPropertyChanged

    Public Property outIsChecked As Boolean
        Get
            Return Me.IsChecked
        End Get
        Set(valueChecked As Boolean)
            If valueChecked <> Me.IsChecked Then
                Me.IsChecked = valueChecked
                'NotifyPropertyChanged("IsChecked")
                'OnPropertyChanged(New PropertyChangedEventArgs("IsChecked"))
                RaisePropertyChanged("IsChecked")
            End If

        End Set
    End Property

    Public Sub New()
    End Sub

    Public Sub New(ByVal inIsChecked As Boolean)
        outIsChecked = inIsChecked
    End Sub

    Public Event PropertyChanged As PropertyChangedEventHandler _
    Implements INotifyPropertyChanged.PropertyChanged

    Protected Sub RaisePropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

End Class

点击事件:

Public Sub MyClickEvent_OnClicked(sender As Object, e As RoutedEventArgs)

    Dim cbx1 As ChordPattern = CType(checkboxList(keyIndexes(0)), MyCustomCheckBox)
    cbx1.outIsChecked = False
    cbx1.IsEnabled = False

    'cbx1.GetBindingExpression(MyCustomCheckBox.IsEnabledProperty).UpdateTarget()
End Sub

您可以覆盖 Style 并为 "Click" 事件添加特殊的 EventTrigger,这会将 IsEnabled 属性 设置为 false。

<CheckBox>
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled">
                                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>                       
</CheckBox>

在您的情况下,最好摆脱对 outIsChecked 属性 的绑定,并直接使用单击事件处理程序中的 CheckBox.IsEnabled。

类似的东西:

Public Sub MyClickEvent_OnClicked(sender As Object, e As RoutedEventArgs)

    Dim cbx1 As ChordPattern = CType(checkboxList(keyIndexes(0)), MyCustomCheckBox)
    cbx1.IsChecked = False
    cbx1.IsEnabled = False    
End Sub

并且去掉绑定,因为这里好像没用:

<DataTemplate>
<CheckBox Content="test" 
    ToolTip="test"
    IsThreeState="False"
    x:Name="myCheckBox"
    Click="MyClickEvent_OnClicked"/>
</DataTemplate>