单击时将 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>
我有一个 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>