WPF单选按钮IsHitTestVisible不工作
本文关键字:工作 IsHitTestVisible 单选按钮 WPF | 更新日期: 2023-09-27 18:14:04
我在列表框中使用单选按钮,不能禁用它们。搜索后,我找到了关于IsEnabled和IsHitTestVisible的链接。当我设置IsEnabled为false时,按钮和文本变成灰色,但它仍然是可点击的。设置IsHitTestVisible不会改变这一点。我的XAMLcode看起来像这样:
<ListBox ItemsSource="{Binding Source}" BorderThickness="0" VerticalAlignment="Stretch" Background="Transparent" SelectedItem="{Binding SelectedSource, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" >
<ListBox.ItemTemplate>
<DataTemplate>
<RadioButton IsHitTestVisible="{Binding IsEnabled}" IsEnabled="{Binding IsEnabled}" Margin="0 2 0 0" FontSize="12" FontFamily="Segoe UI Regular" Content="{Binding name}" GroupName="GroupList" >
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}">
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
</Style>
</RadioButton.Style>
</RadioButton>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
c#中计算并返回bool值的属性。
public bool IsEnabled
{
get
{
IsEnabledCalculate();
return isEnabled;
}
}
关于如何禁用选择有什么想法吗?
在ListBox
的RadioButton
上使用IsHitTestVisible
是一个良好的开端。这样,当您单击RadioButton
时,事件将"通过"它并由ListBoxItem
处理(项目被选中)。然后你可以通过绑定ListBoxItem
的IsSelected
属性来操作IsChecked
属性。
然而,这仍然不足以实现你想要的。首先,您将IsEnabled
属性绑定在错误的级别上:RadioButton
。正如您所注意到的,这仍然允许ListBoxItem
被选中。因此,您需要将IsEnabled
属性绑定到ListBoxItm
的IsEnabled
属性:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsEnabled" Value="{Binding Path=IsEnabled}"/>
</Style>
</ListBox.ItemContainerStyle>
这里还有一个小问题。当您的IsEnabled
属性在代码隐藏中更改时,ListBoxItem
将被禁用,但RadioButton
仍将被检查。为了防止这种情况并在项目被禁用时取消选中RadioButton
,您可以使用DataTrigger
:
<DataTemplate>
<RadioButton GroupName="GroupList" IsHitTestVisible="False"
Margin="0 2 0 0" FontSize="12" FontFamily="Segoe UI Regular"
Content="{Binding name}" >
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}">
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled}" Value="False">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
</DataTemplate>