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;
    }
}

关于如何禁用选择有什么想法吗?

WPF单选按钮IsHitTestVisible不工作

ListBoxRadioButton上使用IsHitTestVisible是一个良好的开端。这样,当您单击RadioButton时,事件将"通过"它并由ListBoxItem处理(项目被选中)。然后你可以通过绑定ListBoxItemIsSelected属性来操作IsChecked属性。

然而,这仍然不足以实现你想要的。首先,您将IsEnabled属性绑定在错误的级别上:RadioButton。正如您所注意到的,这仍然允许ListBoxItem被选中。因此,您需要将IsEnabled属性绑定到ListBoxItmIsEnabled属性:

        <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>