取消选中样式 Setter 中的复选框?

Unchecking a CheckBox from a Style Setter?

我有多个形式的数据触发器:

 <Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}">
            <Setter Property="Height" Value="14" />
            <Setter Property="FontSize" Value="12" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=PrimaryInsuranceCompany, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                    <Setter Property="IsChecked" Value="False" />
                </DataTrigger>

CheckBox 上的 IsEnabled 属性 设置正确。但是,如果首先手动检查 IsChecked 属性,则不会取消检查。

能否从 Setter 中取消选中 IsChecked

编辑#1

To complicate matters a bit more, the checkbox is bound to a property in my viewmodel as:

  <CheckBox 
                  Style="{StaticResource VerifyCheckBox}"
                  IsChecked="{Binding PrimaryInsurance.SelectedInsurance.Verify}" 
                  Content="Verify" HorizontalAlignment="Left" Margin="789,92,0,676" Width="46" />

Style.Triggers 中有多个 DataTrigger,每个都检查 UI 中的不同元素。简而言之,UI 具有所有数据验证。例如,上面命名的元素 PrimaryInsuranceCompany 是:

 <wc:AutoFilteredComboBox 
                  Name="PrimaryInsuranceCompany"
                  IsEnabled="{Binding PrimaryInsurance.Enabled}"
                  ItemsSource="{Binding PrimaryInsurance.AllCompanies}"
                  ItemTemplate="{StaticResource CompanyTemplate}"
                  IsEditable="True"
                  IsCaseSensitive="False" 
                  IsTextSearchEnabled="True" 
                  TextSearch.TextPath="Companyname"
                  Text="{Binding PrimaryInsurance.NewCompanyName, UpdateSourceTrigger=PropertyChanged}"
                  theFilter="{Binding PrimaryInsurance.TheFilter}" 
                  SelectedItem="{Binding PrimaryInsurance.SelectedInsurance.Company}"
                  h:ComboBoxRegexValidator.RegexText="{x:Static h:RegexLibrary.NonEmptyRegex}"
                  HorizontalAlignment="Left" Margin="590,138,0,0" VerticalAlignment="Top" Width="363"  />

因此,特别是对于组合框元素,我试图避免在视图模型中重复验证过程,因为它已经直接在视图中完成。这能做到吗?

这经常会引起混淆。您可能想阅读此内容:https://msdn.microsoft.com/en-us/library/vstudio/ms743230%28v=vs.100%29.aspx。 基本上,wpf 中的依赖属性可能设置在不同的地方:本地 (IsChecked=True)、样式中、触发器中,等等。当多处设置属性时,使用特定的解析顺序来解决冲突。这是一个例子:

<Window.Resources>
    <Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}">
        <Setter Property="Height" Value="14" />
        <Setter Property="FontSize" Value="12" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding TestValue}" Value="True">
                <Setter Property="IsChecked" Value="False" />
                <Setter Property="IsEnabled" Value="False" />                    
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<CheckBox Content="Hey there" IsChecked="True" Style="{StaticResource VerifyCheckBox}" />

这里我们在 两个 地方设置 IsChecked:本地 (IsChecked=True) 和触发器中。本地值具有更高的优先级,因此,当 TestValue 变为真时,复选框将 not 取消选中。但是,我们没有在本地设置 IsEnabled,因此它将具有来自触发器的值。请注意,如果我们 did 在本地设置 IsEnabled=True,则触发器将完全不起作用。

现在让我们这样试:

<Window.Resources>
    <Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}">
        <Setter Property="Height" Value="14" />
        <Setter Property="FontSize" Value="12" />
        <Setter Property="IsChecked" Value="True"></Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding TestValue}" Value="True">
                <Setter Property="IsChecked" Value="False" />
                <Setter Property="IsEnabled" Value="False" />                    
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<CheckBox Content="Hey there" Style="{StaticResource VerifyCheckBox}" />

我们移动了 IsChecked initial setter 样式,现在它按预期工作,因为触发器优先于样式 setter 中的值。

更新:用户点击不会改变上述行为。因此,如果您有本地 IsChecked=True,然后用户单击两次,然后 TestValue 变为 true - 它不会被取消选中。如果你这样做但初始化 IsChecked=True 样式 setter - 它将被取消选中。