2015-12-16 2 views
1

У меня есть два текстовых поля, поле со списком и кнопка сохранения. Если пользователь выбирает определенное значение поля со списком, становится видимым второе текстовое поле. У меня есть правило проверки, которое проверяет, пусто ли пустое или пустое поле, и если это так, он отключил кнопку сохранения.Применить DataTrigger Setter только в том случае, если элемент виден

<Style x:Key="okButtonEnabler" TargetType="Button"> 
       <Setter Property="IsEnabled" Value="True"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Text, ElementName=FirstTextBox, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IsButtonEnabledConverter}}" Value="0"> 
         <Setter Property="IsEnabled" Value="False"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Text, ElementName=SecondTextBox, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IsButtonEnabledConverter}}" Value="0"> 
         <Setter Property="IsEnabled" Value="False"/> 
        </DataTrigger> 
       </Style.Triggers> 
</Style> 

<TextBox Grid.Row="1" Grid.Column="1" Margin="2" Validation.ErrorTemplate="{StaticResource validationTemplate}" Name="FirstTextBox" 
      Style="{StaticResource textBoxInError}"> 
       <TextBox.Text> 
        <Binding Path="FirstValue"> 
         <Binding.ValidationRules> 
          <validationRules:EmptyStringValidationRule ErrorMessage="Must enter first value" /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 
</TextBox> 

<TextBox Grid.Row="2" Grid.Column="1" Visibility="{Binding IsSecondValueSelected, Converter={StaticResource SecondTextBoxVisiblityConverter}}" Margin="2" Validation.ErrorTemplate="{StaticResource validationTemplate}" 
      Style="{StaticResource textBoxInError}" Name="SecondTextBox"> 
       <TextBox.Text> 
        <Binding Path="SecondValue"> 
         <Binding.ValidationRules> 
          <validationRules:EmptyStringValidationRule ErrorMessage="Must enter second value" /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 

Так прямо сейчас, независимо от того, если второго текстового поля видимое или нет, триггер данных будет применяться и кнопка будет отключена, пока второе текстовое поле не является пустым. Я хочу этот сценарий, только если отображается второе текстовое поле.

ответ

2

Использование MultiDataTrigger объединить более одного условия

например:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="okButtonEnabler" 
       TargetType="Button"> 
      <Setter Property="IsEnabled" 
        Value="True" /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Text, ElementName=FirstTextBox, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IsButtonEnabledConverter}}" Value="0" /> 
         <Condition Binding="{Binding Text, ElementName=SecondTextBox, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IsButtonEnabledConverter}}" 
            Value="0" /> 
        </MultiDataTrigger.Conditions> 

        <Setter Property="IsEnabled" 
          Value="False" /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 

    </Window.Resources> 
    <Grid> 

     <TextBox Grid.Row="1" 
       Grid.Column="1" 
       Margin="2" 
       Validation.ErrorTemplate="{StaticResource validationTemplate}" 
       Name="FirstTextBox" 
       Style="{StaticResource textBoxInError}"> 
      <TextBox.Text> 
       <Binding Path="FirstValue"> 
        <Binding.ValidationRules> 
         <validationRules:EmptyStringValidationRule ErrorMessage="Must enter first value" /> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 

     <TextBox Grid.Row="2" 
        Grid.Column="1" 
        Visibility="{Binding IsSecondValueSelected, Converter={StaticResource SecondTextBoxVisiblityConverter}}" 
        Margin="2" 
        Validation.ErrorTemplate="{StaticResource validationTemplate}" 
        Style="{StaticResource textBoxInError}" 
        Name="SecondTextBox"> 
      <TextBox.Text> 
       <Binding Path="SecondValue"> 
        <Binding.ValidationRules> 
         <validationRules:EmptyStringValidationRule ErrorMessage="Must enter second value" /> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </Grid> 
</Window> 
+0

Правильно! И ты избил меня. Я собирался использовать SecondTextBox.Visibility для второго условия, но либо должен работать:

Смежные вопросы