取消选中样式 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 - 它将被取消选中。
我有多个形式的数据触发器:
<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 - 它将被取消选中。