MultiTrigger在加载时具有一些额外条件

时间:2014-11-05 14:52:31

标签: wpf xaml binding datatrigger wpf-style

我的应用程序中有一个工具窗口。有一些文本输入可用,我在这些文本框上有一些验证规则。 说, 验证规则1 验证规则2 验证规则3

我在该工具窗口上有一个按钮,下面有一个样式

<StackPanel.Resources>
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding ElementName=HeightTextbox, Path=(Validation.HasError)}" Value="false" />
                    <Condition Binding="{Binding ElementName=WeightTextBox, Path=(Validation.HasError)}" Value="false" />
                    <Condition Binding="{Binding ElementName=HeartRateTextBox, Path=(Validation.HasError)}"     Value="false"      />
                </MultiDataTrigger.Conditions>
                <Setter Property="IsEnabled" Value="true"/>
            </MultiDataTrigger>
        </Style.Triggers>
        <Setter Property="IsEnabled" Value="false" />
    </Style>
</StackPanel.Resources>

和确定按钮

<Button Content="Ok" x:Name="OkButton" Height="32" Width="80" Command="{Binding OkCommand}"/>

它工作正常,但我希望每次用户打开时都不会禁用该按钮,而不是满足验证规则但是也应该应用该规则。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用DataTrigger模式绑定添加一些Visibility监听OneTime属性,并将IsEnabled设置为false。此触发器应放在多重触发器之后,以便它可以覆盖该触发器:

<Style.Triggers>
   <!-- your multi trigger ... -->

   <DataTrigger Property="{Binding Visibility,
                           RelativeSource={RelativeSource Self},
                           Mode=OneTime}" Value="Visible">
       <Setter Property="IsEnabled" Value="false" />
   </DataTrigger>
</Style.Triggers>

上述方法只有在您通过调用Close()方法隐藏工具窗口时才有效,因此下次打开窗口时,它将首先加载。

如果您使用Hide()方法隐藏工具窗口并使用Show()再次打开它,则可以尝试使用以下代码:

<sys:Boolean x:Key="f">false</sys:Boolean>
<Style.Triggers>
   <!-- your multi trigger ... -->

   <Trigger Property="Visibility" Value="Visible">
       <Setter Property="IsEnabled" Value="{Binding Resources[f],
                 RelativeSource={RelativeSource AncestorType=StackPanel},
                 Mode=OneTime}"/>
   </Trigger>
</Style.Triggers>

请注意这里使用的前缀sys,您必须将命名空间System导入XAML代码。我希望你知道怎么做。