仍然可以选择已禁用的RadioButton

时间:2014-04-18 15:28:59

标签: c# wpf radio-button

我有一个ListBox,其中包含由RadioButtons组成的项目。它们是通过为ItemsSource提供动态创建的。以下是ListBox

的XAML
<ListBox 
   Margin="20,5,0,0" 
   Width="Auto" 
   Background="Transparent" 
   BorderThickness="0" 
   BorderBrush="Transparent" 
   DisplayMemberPath="DisplayValue" 
   SelectedValuePath="Value" 
   SelectedItem="{Binding Path=SingleAnswer}" 
   ItemsSource="{Binding Path=AnswerOptions}">
   <!-- KLG Score ItemsSource converter to filter out 'Unable to Assess' -->
   <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
         <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
   <ListBox.Resources>
      <Style TargetType="{x:Type ListBoxItem}">
         <Setter Property="Margin" Value="0,0,25,0" />
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type ListBoxItem}">
                  <Border Background="Transparent" BorderThickness="0" BorderBrush="Transparent">
                     <Border.IsEnabled>
                        <MultiBinding Converter="{StaticResource RadioButtonToEnabledConverter}" >
                           <Binding Mode="OneWay" ElementName="this" Path="ParentForm.ImagesExist"/>
                           <Binding Mode="OneWay" Path="." />
                        </MultiBinding>
                     </Border.IsEnabled>
                     <RadioButton Focusable="False" IsHitTestVisible="False" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" Click="KLGScoreRadioButton_Click" >
                        <RadioButton.IsEnabled>
                           <MultiBinding Converter="{StaticResource RadioButtonToEnabledConverter}" >
                              <Binding Mode="OneWay" ElementName="this" Path="ParentForm.ImagesExist"/>
                              <Binding Mode="OneWay" Path="." />
                           </MultiBinding>
                        </RadioButton.IsEnabled>
                        <ContentPresenter />
                     </RadioButton>
                  </Border>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </ListBox.Resources>
</ListBox>

现在,其中一个答案不应该由用户选择,它应该只是自动填充,具体取决于业务逻辑指定的内容。

为此,我为RadioButton.IsEnabled属性创建了一个转换器,以便始终将指定的RadioButton设置为禁用。这有效;在应用程序中它被正确禁用。但是,如果用户单击禁用选项,它仍然允许选择它。我也尝试在父Border上使用相同的转换器(如上面的xaml所示),但行为没有改变。

我还尝试在Click事件的RadioButton事件中添加一个侦听器,以便在选择禁用选项时将其设置为处理,但该事件由于某种原因未被触发。

无论如何不允许用户选择此选项?

1 个答案:

答案 0 :(得分:3)

如果您想要不选择特定条目,可以在ListBoxItem样式中绑定该项目的IsHitTestVisible。

这样的事,

<Setter Property="IsHitTestVisible" Value="{Binding IsSelectable}" />

IsSelectable是您的数据。